如何将 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 参数传递到委托命令中,它将动态工作。对于这样的情况,有这样的事情吗?谢谢!

如何将 IsEnabled 属性绑定到 ViewModel 中更动态的属性

您可以从类范围内的代码中的任何位置调用 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);
            }
      }

如果将更复杂的条件添加到您的属性中,这将更容易维护,并且更具可读性。