我正在进行我的第二个WPF项目,遇到了一个不舒服的情况。这是我的型号:
public class Layout
{
public string Name { get; set; }
public Motor Motor { get; set; }
}
public class Motor
{
public string Property1 { get; set; }
...
public string Property150 { get; set; }
}
这是我的MainViewModel:
public class MainViewModel : ViewModelBase
{
public Motor Motor {get; set;}
...
}
好的,我已经将电机类的所有150个属性绑定到文本框:
<TextBox Text="{Binding Layout.Motor.Property1}"/>
问题1)如果我想在用户更改其中一个时触发一个操作,我是否必须实现150次??
private string property1 { get; set; }
public string Property1
{
get { return property1; }
set
{
property1 = value;
RaisePropertyChanged(() => Property1);
}
}
问题2)我必须在MainViewModel、"Motor"模型中实现这一点吗?还是我需要一个"MotorViewModel"?其中任何一个都意味着大量的复制&粘贴和完全无用的编码。。
感谢您的帮助和反馈!
首先,RaisePropertyChanged
实际上用于UI,以便在代码更改项目时通知它。当然,你也可以手动收听,但通常不会。
您通常也不使用auto属性作为后备字段,但这可能是由于您的PropertyChanged
实现。
现在这已经解决了:
是的,您需要实现它,或者类似的东西,允许PropertyChanged
被提升150次现在,人们想知道为什么你在一个物体上有150个属性,所以你可能想先重新考虑这个设计。但如果你真的需要它们,那么是的,复制粘贴是你的未来。考虑编写一个代码片段,使其运行得更快。
为了回答您的另一个问题,您可以很容易地将其放在"模型"对象中,只要该对象可以用作DTO。换句话说,它实际上并没有以某种方式与模型绑定(比如说,具有模型功能),而是可以在层之间浮动。你甚至可以把INPC放在数据合同上,它不会伤害任何东西。
需要考虑的另一件事是,如果您只想在电机更改时通知UI,而不是其单独的属性,那么您只需在Motor
属性上进行通知,所有绑定都将更新。
动态救援!
public class DynamicDictionary : DynamicObject, INotifyPropertyChanged
{
private readonly Dictionary<string, object> dictionary;
public DynamicDictionary(Dictionary<string, object> dictionary)
{
this.dictionary = dictionary;
}
public override bool TryGetMember(
GetMemberBinder binder, out object result)
{
return dictionary.TryGetValue(binder.Name, out result);
}
public override bool TrySetMember(
SetMemberBinder binder, object value)
{
dictionary[binder.Name] = value;
// magic!
OnPropertyChanged(binder.Name);
return true;
}
#region INPC implementation
// SNIP! I ain't writing all that junk out
#endregion
}
(大部分代码都来自这个答案)
绑定可以像DynamicObject一样识别实现IDynamicMetaObjectProvider的类型,并知道如何使用它们。试试看。