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

时间:2014-12-17 17:13:47

标签: c# wpf mvvm

我有一个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.
    }
}

现在显然这永远不会更新View,因为此处发生了OnPropertyChanged事件。事实上,如果我知道将OnPropertyChanged放在哪里,但在这种情况下,许多事情可以触发更改此属性,因此没有意义。在这种情况下,有人会怎么做?

如果这是一个带有命令绑定的按钮,例如,我会将IsSaved作为CanExecute参数传递给委托命令,它会动态工作。对于像这样的情况,有类似的东西吗?谢谢!

1 个答案:

答案 0 :(得分:4)

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

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