级联 属性 已更改

Cascade Property Changed

我有一个带有绑定的表格:

  <TextBox
      x:Name="txtGroupName"
      Height="23"
      Margin="96,13,10,0"
      VerticalAlignment="Top"
      TabIndex="0"
      Text="{Binding UserLevel.Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
      TextWrapping="Wrap" />

使用 MVVM 有一个它绑定到的视图,包含以下内容:

        public UserLevel UserLevel
        {
            get { return _userLevel; }
            set { _userLevel = value; OnPropertyChanged("UserLevel"); OnPropertyChanged("SaveButtonEnabled"); }
        }

        public bool SaveButtonEnabled
        {
            get { return UserLevel.IsValid(); }
        }

然而,当文本框值被更新时,即使它绑定到 UserLevel.Name,UserLevel 属性 也永远不会设置视图。文本值已设置(即名称),但即使视图和它后面的 class 已更新 属性,SaveButtonEnabled 也永远不会 运行。我知道我可能可以但是在视图调用名称中使用 属性 然后更新 UserLevel,但这样做似乎违反直觉,肯定有更好的方法。

看来我想级联 属性Changed 事件。

提前致谢。

詹姆斯

文本框中的更改不会触发 UserLevel setter 中的 On属性Changed,因为 UserLevel 属性从未更改过。 TextBox 绑定到 UserLevel 的 Name-属性,因此只有 UserLevel 的 Name 属性 的 属性Changed(如果其实现 属性 更改)将被触发.

如您所写,解决此问题的一种方法是在视图中添加包装器 属性:

public string Name
{
   get{ return UserLevel.Name;}
   set{ UserLevel.Name = value;  OnPropertyChanged("SaveButtonEnabled")}
      
}

并将此 属性 绑定到文本框。

第二种选择,也是我认为更好的选择,是为保存按钮使用命令:

https://jigneshon.blogspot.com/2013/11/c-wpf-tutorial-command-bindings-and.html

https://docs.microsoft.com/en-us/dotnet/desktop/wpf/advanced/commanding-overview?view=netframeworkdesktop-4.8

在 CanExecute 中,您可以 return UserLevel.IsValid()