WPF:阻止OnPropertyChanged的最佳方法

时间:2015-01-27 20:34:06

标签: c# wpf inotifypropertychanged

我已经使用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;

但还有更好的方法吗?我只是不明白一些基础知识? : - )

非常感谢

罗马

1 个答案:

答案 0 :(得分:3)

你有一个向后。

INotifyPropertyChanged,因此PropertyChanged事件, 是什么使UI更新,实际上是使整个绑定系统工作的原因。

因此,要更新用户界面,您来举起该事件。现在,从代码方面来看,您几乎从不订阅该事件,因为您只需从setter调用一个方法。类似的东西:

    set
    {
        _ischecked = value;
        OnPropertyChanged("IsChecked");

        if (!Blocked)
            MyOtherMethod();
    }

请注意,如果您正在处理线程,那么Blocked条件会导致主要同步危险。

如果确实需要从代码注册PropertyChanged,那么最好的办法就是取消注册-=。这样UI仍然可以获得它的事件,但你没有。