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 仍然会收到它的事件,但你不会。