【问题标题】:Cascade Property Changed级联属性已更改
【发布时间】:2022-01-18 13:16:26
【问题描述】:

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

  <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 属性是视图永远不会设置。文本值已设置(即名称),但即使其背后的视图和类已更新属性,SaveButtonEnabled 也永远不会运行。我知道我可能会在视图调用名称中添加一个属性,然后更新 UserLevel,但这样做似乎违反直觉,肯定有更好的方法。

看来我想级联 PropertyChanged 事件。

提前致谢。

詹姆斯

【问题讨论】:

    标签: c# .net mvvm


    【解决方案1】:

    文本框中的更改不会触发 UserLevel 设置器中的 OnPropertyChanged,因为 UserLevel 属性从未更改。 TextBox 绑定到 UserLevel 的 Name-Property,因此只会触发 UserLevel 的 Name 属性的 PropertyChanged(如果其实现属性发生更改)。

    正如你已经写过的,解决这个问题的一种方法是在视图中添加一个 Wrapper 属性:

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

    并将此属性绑定到 TextBox。

    第二个选项,我认为更好的选择是使用 SaveButton 的命令:

    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中,可以返回UserLevel.IsValid()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-17
      • 1970-01-01
      • 2013-11-02
      • 2019-10-30
      • 2016-07-15
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      相关资源
      最近更新 更多