所以我将事件设置为类
void item_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
}
当一个类的属性发生变化时它会被触发,但是我想在类似的类中进行相同的更改。以此为例
class A: INotifyPropertyChanged
{
//event handler declaration
string PhoneNumber;
string _name;
Public string Name {
get { return _name;}
set { _name = value; PropertyChanged("Name");}
}
}
class B
{
string Name;
int age;
}
和A类的事件绑定;
void item_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
}
我想要的是复制A的Name属性的内容并将其分配给B的实例。
这样做的优雅方法是什么?我的问题是知道A的哪个值发生了变化(在我的课堂上它不仅仅是名字,而是更多)。
答案 0 :(得分:5)
使用PropertyName attribute of the PropertyChangeEventArgs找出修改了哪个属性,然后使用一些逻辑将该属性设置为,我正在调用的内容为boundItems
。
如果需要,可以使用sender对象并将其强制转换为适当的类型,这样可以提高灵活性。使用Reflection
将允许您通过仅使用String
的{{1}}值来获取和设置属性而不会涉及真正的手工劳动,但是它的开销更大,所以如果你是做了很多,我建议不要这样做。
PropertyName
或者,您可以使用Reflection来设置属性,而不是构建switch case。
void item_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
switch(e.PropertyName)
{
case "Name":
//You Code
boundItem.Name = (sender as A).Name;
break;
}
}
但是,最好的选择是创建具有内置于对象属性中的这些关系的类。修改属性的void item_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
//Untested Reflection example. Probably needs some modifying.
PropertyInfo prop = typeof(A).GetType()
.GetProperty(e.PropertyName, BindingFlags.Public | BindingFlags.Instance);
PropertyInfo boundProp = typeof(B).GetType()
.GetProperty(e.PropertyName, BindingFlags.Public | BindingFlags.Instance);
boundProp.SetValue (boundItem, prop.GetValue((sender as A),0), null);
}
和get
以同时设置受影响的属性和set
属性。这看起来像这样:
boundItems
答案 1 :(得分:0)
您必须使用Reflection,示例代码将如下所示
public class SomeClass : INotifyPropertyChanged
{
public void OnPropertyChanged(string propertyName , object before, object after)
{
Type type = this.GetType();
var val = type.GetProperty(propertyName, BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Instance)?.GetValue(this, null); //Contains changed value
if (propertyName == "Name) {
//Do whatever you want to do with value for "Name"
}
}
}