观察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的状态,基本上,如果所有内容都已批准,则应启用该按钮(提交),如果任何字段未批准,则该按钮应禁用。
如果您只需要在属性更改时更新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
),您可以使用这些选项来指定在属性更改时触发的回调。