如何将 IsEnabled 属性绑定到 ViewModel 中更动态的属性
本文关键字:属性 动态 ViewModel 绑定 IsEnabled | 更新日期: 2023-09-27 18:34:34
我有一个TabItem
,它的IsEnabled
属性绑定到一个名为IsSaved
的ViewModel属性。
它看起来像这样:
<TabItem Header="POs"
IsEnabled="{Binding IsSaved, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}">
很漂亮,对吧?在我看来ViewModel
物业IsSaved
并不那么简单。它被定义为:
public bool IsSaved
{
get
{
return IsDeveloper
&& CheckValidation(null)
&& !IsDirty
&& !displayMasterRepository.IsObjectChanged(); //TODO: this does not work.
}
}
现在显然这永远不会更新视图,因为这里发生了OnPropertyChanged
事件。事实上,如果我知道把OnPropertyChanged
放在哪里,我会的,但在这种情况下,很多很多事情都可以触发此属性的更改,所以这是没有意义的。在这种情况下,有人会怎么做?
例如,如果这是一个带有命令绑定的按钮,我会IsSaved
作为 CanExecute 参数传递到委托命令中,它将动态工作。对于这样的情况,有这样的事情吗?谢谢!
您可以从类范围内的代码中的任何位置调用 OnPropertyChanged。
OnPropertyChanged("IsSaved");
另外我喜欢公开一个公共函数供其他类引发我的属性变化,像这样:
public void RefreshIsSaved()
{
OnPropertyChanged("IsSaved");
}
或者一些不太具体的东西,例如:
public void RaisePropertyChanged(string propertyName)
{
OnPropertyChanged(propertyName);
}
这是你的要求吗?
作为旁注,您还可以以更清晰的方式编写属性:
public bool IsSaved
{
get
{
if(IsDirty || displayMasterRepository.IsObjectChanged())
return false;
return IsDeveloper && CheckValidation(null);
}
}
如果将更复杂的条件添加到您的属性中,这将更容易维护,并且更具可读性。