0

我有一个奇怪的用户控件绑定DataContextIsEnabled属性行为。

在我的页面中,我使用这样的 UserControl:

<httpsPort:HttpsPort DataContext="{Binding Path=Https}"
    IsEnabled="{Binding CurrentServiceState, Converter={StaticResource ServiceStateIsConfigableConverter}}" />

还有一个像这样的按钮:

<Button Content="start service"
    IsEnabled="{Binding CurrentServiceState, Converter={StaticResource ServiceStateIsConfigableConverter}}"
    Command="{Binding CmdConfigureService}" [...] />

解释:

转换器将 currentServiceState-Enum 转换为 bool。我的 Button 的行为符合我的预期(En/DisAbled)。

问题:我的按钮正确启用/禁用,但我的用户控件中的控件没有。

DataContext (HTTPS) 实际上不为空:

private HttpsPortViewModel _https;
    public HttpsPortViewModel Https
    {
        get
        {
            if (_https == null)
            {
                _https = new HttpsPortViewModel();
            }
            return _https;
        }
        set
        {
            _https = value;
            NotifyPropertyChanged(() => Https);
        }
    }

我曾尝试在我的 UserControls 绑定上使用 FallbackValue=False,但随后 UserControl 甚至被禁用...

任何人都可以解释这些行为吗?非常感谢。

更新:

我的解决方法:

<Grid IsEnabled="{Binding CurrentServiceState, Converter={StaticResource ServiceStateIsConfigableConverter}}">
    <httpsPort:HttpsPort DataContext="{Binding Path=Https}" />
</Grid>
4

1 回答 1

0

你不应该绑定你自己的DataContext. 任何绑定操作都使用DataContext,所以绑定 yourDataContext是一个循环操作。即使这有效,也无法保证您的绑定的创建顺序,因此您的IsEnabled属性可能会在您DataContext绑定到其新值之前被绑定。

相反,您应该指定属性的完整路径。例如:

<httpsPort:HttpsPort IsEnabled="{Binding Https.CurrentServiceState, Converter={StaticResource ServiceStateIsConfigableConverter}}" />
于 2012-04-16T09:56:09.873 回答