观察NotifyPropertyChanged并对其做出响应

时间:2013-08-07 14:59:05

标签: c# wpf .net-3.5

我有一组Field个对象,每个Field对象实现INotifyPropertyChanged。字段对象里面有各种属性,但我有一个名为IsApproved的属性,我需要监听任何更改。我的兴趣是,如果设置或取消设置布尔标志,我需要得到通知或基本上我需要响应该事件(该属性将由UI通过WPF绑定设置或取消设置)。我可以为此使用Reactive Extensions,还是过度杀伤?如果不是你会推荐什么?

代码:

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.
}

在我的viewmodel中,我有一个Field的集合,我需要观察它们以查看IsApproved属性何时设置或取消设置在任何或所有属性上。我怎么能这样做?

编辑:我有Fields集合是一个可观察的集合,它绑定到itemscontrol。使用datatemplate呈现字段内的每个项目,并使用模板选择器选择模板。我的IsApproved属性绑定到每个datatemplate中的复选框。我的页面上有一个按钮,并且点击该按钮应该设置所有已批准的复选框。我有另一个按钮跟踪所有批准的状态,基本上如果一切都被批准,那么应该启用该按钮(提交),如果有的话该字段未获批准,则应禁用该按钮。

2 个答案:

答案 0 :(得分:2)

如果您需要做的只是在属性更改时更新UI,您只需绑定到该属性即可完成(如@sircodesalot也提到的那样):

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

如果您想以编程方式收听更改,可以注册PropertyChanged事件,如下所示:

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

答案 1 :(得分:0)

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

<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 TextProperty注册DependencyProperty.Register时,最后一个参数允许我指定一些配置选项(FrameworkPropertyMetadata),您可以使用它来指定在属性时触发的回调变化。