【问题标题】:NotifyPropertyChanged through codeNotifyPropertyChanged 通过代码
【发布时间】:2013-03-06 06:23:05
【问题描述】:

我有一个包含两个其他对象的类。

第一个对象中的一个变量绑定到WPF元素,称之为X

另一个对象中的类似变量。

我希望当 PropertyChanged 事件发生时,它会改变第二个对象中的变量。

这是对我不起作用的代码:

包含变量的类:(我已经注册到属性更改事件)

private Class1 _var1;
    public Class1 Var1
    {
        get { return _var1; }
        set
        {
            _var1= value;
            if (_var1!= null)
                _var1.PropertyChanged += new PropertyChangedEventHandler(_var1_PropertyChanged);
            else
                _var1.PropertyChanged -= new PropertyChangedEventHandler(_var1_PropertyChanged);
        }
    }

    void _var1_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
      if(e.PropertyName=="X")
        Var2.X= Var1.X;
    }

    private Class2 _var2;
    public Class2 Var2
    {
        get { return _var2; }
        set { _var2= value; }
    }

第 1 类:

    private int _x;
    public int X
    {
        get { return _x; }
        set
        {
            if (_x!= value)
            {
                _x= value;
                NotifyPropertyChanged("X");
            }
        }
    }

第 2 类:

public int X { get; set; }

PropertyChanged在第1班工作,但他没有参加我在包含两个变量的班级中创建的事件,为什么?

【问题讨论】:

    标签: c# wpf inotifypropertychanged


    【解决方案1】:

    我不确定我是否完全理解您的意思,但如果我有一个包含 2 个变量的类,我想一起更改,我会尝试以下操作:
    首先,定义一些SetAndNotify 方法,否则PropertyChanged 事件会让你头疼:

    public void SetAndNotify<T>(ref T field, T value, Expression<Func<T>> exp)
    {
        if (!Equals(field, value))
        {
            field = value;
            OnPropertyChanged(exp);
        }
    }
    

    将它添加到一些将处理此事件的基类中。

    其次,在Var1 的设置器中,您注册了更改事件并且没有设置任何内容,这是故意的吗?

    第三点也是最后一点,在 setter 中更改多个属性没有问题,但请确保更改的是公共属性:

    private SomeType privateVar1;
    public SomeType PublicVar1
    {
        get { return privateVar1; }
        set
        {
            SetAndNotify(ref privateVar1, value, () => PublicVar1);
            MyOtherPublicVar = someNewValue; // this will activate the property's setter.       
        }
    }
    

    我希望这会有所帮助。如果不是,请尝试澄清您的问题。

    【讨论】:

      猜你喜欢
      • 2014-05-01
      • 2022-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-21
      • 1970-01-01
      • 2018-02-10
      • 2013-09-20
      相关资源
      最近更新 更多