观察NotifyPropertyChanged并对其作出响应

本文关键字:响应 NotifyPropertyChanged 观察 | 更新日期: 2023-09-27 18:26:42

我有一个Field对象的集合,每个Field对象实现INotifyPropertyChanged。字段对象内部有各种属性,但我有一个名为IsApproved的属性,我需要监听它是否有任何更改。我感兴趣的是,如果布尔标志被设置或取消设置,我需要得到通知,或者基本上我需要对该事件做出响应(UI将通过WPF绑定设置或取消该属性)。我可以使用反应式扩展吗?或者这是过分了吗?如果没有,你会推荐什么?

代码:

public class Field : INotifyPropertyChanged
{
  private bool _isApproved;
        public bool IsApproved
        {
            get { return _isApproved; }
            set
            {
                if (_isApproved == value)
                    return;
                _isApproved = value;
                RaisePropertyChanged(() => IsApproved);
            }
        }
///has lots of other properties.
}

在我的视图模型中,我有一个Field的集合,我需要观察它们,以查看何时在其中任何一个或全部上设置或取消设置IsApproved属性。我该怎么做?

编辑:我有Fields集合,一个可观察的集合,它绑定到一个itemscontrol。字段中的每个项都使用数据模板进行渲染,并使用模板选择器选择模板。我的IsApproved属性绑定到每个数据模板中的一个复选框。我的页面上有一个按钮,点击该按钮后,应设置所有Approved复选框。我有另一个按钮,它跟踪所有Approvals的状态,基本上,如果所有内容都已批准,则应启用该按钮(提交),如果任何字段未批准,则该按钮应禁用。

观察NotifyPropertyChanged并对其作出响应

如果您只需要在属性更改时更新UI,您只需绑定到该属性即可完成(@sircodesalot也提到了这一点):

<Checkbox IsChecked="{Binding IsApproved}" />

但是,如果您想以程序方式侦听更改,您可以注册到PropertyChanged事件,如下所示:

myField.PropertyChanged += (sender, e) =>
{
    if (e.PropertyName == "IsApproved")
    {
        // Do stuff
    }
}

如果你在窗口上有一个绑定,比如说一个复选框:

<Checkbox IsChecked="{Binding IsApproved}" />

属性更改时,您应该收到通知。

也就是说,还可以构建依赖属性,以便在属性更改时进行回调。这与您的示例所显示的略有不同(但值得了解,因为它仍然密切相关)。考虑:

public partial class InfoBox : UserControl {
    public static DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(String), typeof(InfoBox),
        new FrameworkPropertyMetadata(TextPropertyChanged));

    public static void TextPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args) {
        InfoBox infoBox = (InfoBox)sender;
        infoBox.ContentText.Content = args.NewValue;
    }
    public String Text {
        get { return (String)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }
}

本质上,该类定义了一个TextProperty,并创建了一个访问器(底部)。当我用WPF(DependencyProperty.Register)注册TextProperty时,最后一个参数允许我指定一些配置选项(FrameworkPropertyMetadata),您可以使用这些选项来指定在属性更改时触发的回调。