在对象重新分配时触发 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 元素。
我有 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 元素。