我在我的第二个 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 个属性绑定(bind)到文本框:
<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,在 code 更改项目时通知它。当然,您也可以手动监听它,但通常不会这样做。
您通常也不使用自动属性作为支持字段,但这可能是由于您的 PropertyChanged
实现所致。
现在已经不在了:
是的,您需要实现它,或者类似的东西,允许 PropertyChanged
提高 150 倍。现在,有人想知道为什么您有 150 个属性在一个对象上,所以你可能想先重新考虑那个设计。但如果你真的需要它们,那么是的,复制粘贴是你的 future 。考虑编写代码片段以使其运行速度更快。
要回答您的其他问题,您可以轻松地将它放在“模型”对象中,只要该对象可以用作 DTO。换句话说,它实际上并没有以某种方式(例如,具有模型功能)绑定(bind)到模型,而是可以在层之间 float 。您甚至可以将 INPC 置于数据契约(Contract)中,这不会造成任何伤害。
还有一件事需要考虑,如果您只想在 motor 发生变化时通知 UI 而不是它的各个属性,您可以只在 Motor
属性上通知所有绑定(bind)都将更新。
关于c# - 使大型模型可观察,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29548926/