我已经使用INotifyPropertyChanged实现了WPF数据绑定。
public class ExportNode : INotifyPropertyChanged
{
public uint Handle { get; set; }
public String Text { get; set; }
private bool _ischecked;
public bool IsChecked
{
get
{
return _ischecked;
}
set
{
_ischecked = value;
OnPropertyChanged("IsChecked");
}
}
public event PropertyChangedEventHandler PropertyChanged;
// Create the OnPropertyChanged method to raise the event
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
}
而且订阅事件形成我的代码,所以每当我在UI中更改属性时,它都会触发回调。 但是现在我正试图找出从代码中更改属性的最佳方法,而不是激活回调,只需更新UI。
void newNode_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "IsChecked")
{
}
}
现在我只考虑在ExportNode
中实现一些“blocker”成员属性 protected void OnPropertyChanged(string name)
{
if (Blocked)
return;
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
或在更改前删除事件表单实例。
newNode.PropertyChanged -= newNode_PropertyChanged;
newNode.IsChecked = true;
newNode.PropertyChanged += newNode_PropertyChanged;
但还有更好的方法吗?我只是不明白一些基础知识? : - )
非常感谢
罗马
答案 0 :(得分:3)
你有一个小向后。
INotifyPropertyChanged
,因此PropertyChanged
事件, 是什么使UI更新,实际上是使整个绑定系统工作的原因。
因此,要更新用户界面,您有来举起该事件。现在,从代码方面来看,您几乎从不订阅该事件,因为您只需从setter调用一个方法。类似的东西:
set
{
_ischecked = value;
OnPropertyChanged("IsChecked");
if (!Blocked)
MyOtherMethod();
}
请注意,如果您正在处理线程,那么Blocked
条件会导致主要同步危险。
如果确实需要从代码注册PropertyChanged
,那么最好的办法就是取消注册-=
。这样UI仍然可以获得它的事件,但你没有。