【问题标题】:Strange Behavior Binding DataContext & IsEnabled-Property on UserControlUserControl 上的奇怪行为绑定 DataContext 和 IsEnabled-Property
【发布时间】:2012-04-16 08:58:05
【问题描述】:

我有一个奇怪的行为绑定DataContext & IsEnabled UserControl 的属性。

在我的页面中,我使用这样的 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>

【问题讨论】:

  • 您从未真正说出您的问题。请这样做。
  • 嗨,丹尼尔,问题是,用户控件不像按钮那样被启用/禁用。
  • 我认为绑定 DataContext 属性不是一个好主意。为什么要为用户控件这样做?它似乎适用于没有它的按钮。
  • 我的 UserControl 也有一个 ViewModel (MVVM),父 viewModel 使用来自 UserControlViewModel 的属性。
  • 我不确定我是否理解正确,但是绑定datacontext属性会导致datacontext一次又一次地被永久设置。而是使用适当的 BindingPath。例如。 Https.CurrentServiceState

标签: c# wpf binding user-controls


【解决方案1】:

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

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

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

【讨论】:

  • 好的,我了解绑定顺序的问题。主要思想是将一组控件外包为用户控件。这些组框用于两个(页面)ViewModel。这些 ViewModels 需要访问 UserControlViewModel(获取端口和选定的证书),但(页面)viewmodels 应该能够禁用用户控件(例如服务正在运行)。也许,我的“解决方案”不是最好的方法......注意 CurrentServiceState 不是 https 的属性,它是父视图模型(页面)的属性
  • 然后只需从每个 PageViewModel 公开您的 UserControlViewModel。 DataContext 仍然指向 PageViewModel,您可以按照我的回答将您的用户控件属性与完整路径绑定。
猜你喜欢
  • 2011-02-27
  • 2021-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-01
  • 1970-01-01
  • 2013-09-22
  • 1970-01-01
相关资源
最近更新 更多