我有一组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中的复选框。我的页面上有一个按钮,并且点击该按钮应该设置所有已批准的复选框。我有另一个按钮跟踪所有批准的状态,基本上如果一切都被批准,那么应该启用该按钮(提交),如果有的话该字段未获批准,则应禁用该按钮。
答案 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
),您可以使用它来指定在属性时触发的回调变化。