WPF:阻止 OnPropertyChanged 的最佳方式
WPF: Best way to block OnPropertyChanged
我已经使用 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;
但是有没有更好的办法呢?我只是不明白一些基础知识? :-)
非常感谢
罗马
你倒退了一点。
INotifyPropertyChanged
,因此 PropertyChanged
事件, 是 使 UI 更新的原因,事实上,它使整个绑定系统工作。
因此,要更新 UI,您 必须 引发该事件。现在,从代码方面来看,您几乎 永远不会 订阅该事件,因为您可以从 setter 调用一个方法。类似于:
set
{
_ischecked = value;
OnPropertyChanged("IsChecked");
if (!Blocked)
MyOtherMethod();
}
请注意,如果您正在处理线程,Blocked
条件是主要 同步危险。
如果您 确实 需要通过代码注册 PropertyChanged
,那么您最好的选择就是注销 -=
。这样 UI 仍然会收到它的事件,但你不会。
我已经使用 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;
但是有没有更好的办法呢?我只是不明白一些基础知识? :-)
非常感谢
罗马
你倒退了一点。
INotifyPropertyChanged
,因此 PropertyChanged
事件, 是 使 UI 更新的原因,事实上,它使整个绑定系统工作。
因此,要更新 UI,您 必须 引发该事件。现在,从代码方面来看,您几乎 永远不会 订阅该事件,因为您可以从 setter 调用一个方法。类似于:
set
{
_ischecked = value;
OnPropertyChanged("IsChecked");
if (!Blocked)
MyOtherMethod();
}
请注意,如果您正在处理线程,Blocked
条件是主要 同步危险。
如果您 确实 需要通过代码注册 PropertyChanged
,那么您最好的选择就是注销 -=
。这样 UI 仍然会收到它的事件,但你不会。