在对象重新分配时触发 INotifyPropertyChanged

Fire INotifyPropertyChanged on object reassignment

我有 2 个 windows,mainWindow 和 editWindow。 editWindow 有一个保存按钮。 windows 都绑定到 Robot class.

实例的属性

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

如果 mainWindow 绑定到 robot1 并且 editWindow 绑定到 robot2,我知道 robot1 = robot2 将打破绑定并且不会在原始实例上触发 INotifyPropertyChanged。

如何将robot2的属性重新赋值给robot1,让robot1仍然是绑定的物品?简单的方法是一次复制每个 属性,但我将在具有不同类型对象的多个表单上执行此操作。我想一般地这样做。

你有两个选择。第一种是简单地将每个 属性 的值从一个对象复制到另一个对象。第二种是利用反射找到对象的所有public属性,并复制到另一个。第一个选项实施起来要快得多,通常会在数据 class 中完成,例如。添加一个 CopyValuesTo 方法,看起来像这样:

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

创建 robot1 的 属性 并命名为 Robot1

首先创建一个class:

public class Notifier : INotifyPropertyChanged {

[field: NonSerialized]
public event PropertyChangedEventHandler PropertyChanged;

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

}

然后像这样从 Notifier 继承 Robot class:

public class Robot :Notifier{...}

在那之后,你在你的 ViewModel 中创建一个属性:

private Robot robot1;

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

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

如果您将 UI 绑定到 Robot1,然后像

一样更新它
Robot1 = robot2;

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