在对象重新分配时触发INotifyPropertyChanged

时间:2015-03-12 13:53:50

标签: c# wpf data-binding

我有2个窗口,mainWindow& editWindow。 editWindow有一个保存按钮。两个窗口都绑定到Robot类实例上的属性。

editWindow使用mainWindow使用的Robot实例的深层克隆副本(创建一个新实例)。当用户点击editWindow保存按钮时,我想将克隆实例的属性重新分配回mainWindow上的原始实例。

如果mainWindow绑定到robot1& editWindow绑定到robot2,我知道robot1 = robot2会破坏绑定而不会在原始实例上触发INotifyPropertyChanged。

如何将robot2的属性重新分配给robot1,以便robot1仍然是绑定项目?简单的路线是一次复制一个属性,但我会在不同类型的对象的几个表单上执行此操作。我一般都想这样做。

2 个答案:

答案 0 :(得分:1)

您有两种选择。第一种是简单地将每个属性的值从一个对象复制到另一个对象。第二种是使用反射来查找对象的所有公共属性并将它们复制到另一个。第一个选项实现起来要快得多,通常可以在数据类中完成,例如。添加一个CopyValuesTo方法,看起来像这样:

public void CopyValuesTo(YourDataType dataType)
{
    Property1 = dataType.Property1;
    Property2 = dataType.Property2;
    ...
    PropertyN = dataType.PropertyN;
}

答案 1 :(得分:0)

制作robot1名为Robot1的商品。

首先创建一个类:

public class Notifier : INotifyPropertyChanged {

[field: NonSerialized]
public event PropertyChangedEventHandler PropertyChanged;

protected virtual void RaisePropertyChanged( string propertyName ) {
    if ( PropertyChanged != null ) {
        PropertyChanged(
            this,
            new PropertyChangedEventArgs(propertyName));
    }
}

}

然后从Robot开始,让你的Notifier课程如下:

public class Robot :Notifier{...}

之后,您在ViewModel

中创建了一个属性
private Robot robot1;

也许在你的构造函数中初始化。 并创建一个属性:

public Robot Robot1 {
        get {
            return robot1;
        }
        set {
            robot1 = value;
            RaisePropertyChanged("Robot1");
        }
    }

如果您将用户界面绑定到Robot1,然后将其更新为

Robot1 = robot2;

它不会破坏绑定,并更新UI元素。