我有一个由三个类组成的模型:A,B和C. A的ObservableCollection为B,B的ObservableCollection为C. C有一个引用(不可观察......我认为不需要)到它的父(B),而B有一个引用A. A,B和C的每个属性都会通知其更改。
然后我有一个Model类,它“跟踪”所有分配的对象。因此它有一个Ob的ObservableCollection,B和C(唯一需要的是As;我保留B和C的列表只是为了更快的参考)。
我的UI有一个自定义控件:它有一个ViewModel。该视图有一个列表。它的ItemSources将其ViewModel绑定到名为sensors的observablecollection。这个ObservableCollection是RowViewModel。每个RowViewModel都保留对C对象的引用。
我的应用程序加载模型(创建A,B,C对象),然后通过调用此方法设置视图列表(可能这是问题?)
public void setSensors(IList<C> list)
{
this.sensors.Clear();
if (list != null)
{
foreach (var row in list)
this.sensors.Add(new RowViewModel(row));
}
}
问题在于,如果我修改了C对象的属性,则不会在UI上反映出来。
有人可以帮帮我吗? 谢谢弗朗西斯
编辑:(已解决) 感谢您的回答我检查了我的代码并改变了一件事:不是将我的UI元素绑定到它的ViewModel(而viewModel只是“重定向”对模型属性的调用),我直接将UI绑定到real属性,它作品!! 所以...在MVVM中我不能使用“快捷方式”??或者如果我使用它们,我应该注册属性的通知并“传播”它们吗?
答案 0 :(得分:1)
我认为您的用户界面未更新,因为它已绑定到RowViewModel
对象,而不是C
。因此,您应该在PropertyChanged
的构造函数中订阅C
事件RowViewModel
,并通过RowViewModel.PropertyChanged
通知这些更改。顺便问一下,您能在UI中提供绑定示例吗?
<强>更新:强>
“代理”PropertyChanged
事件的示例:
public class Model: INotifyPropertyChanged
{
private string _YourProperty;
public string YourProperty
{
get { return _YourProperty; }
set
{
if (_YourProperty == value) return;
_YourProperty = value;
RaisePropertyChanged("YourProperty");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public class ViewModel: INotifyPropertyChanged
{
private Model _Model;
public ViewModel(Model model)
{
_Model = model;
_Model.PropertyChanged += OnModelPropertyChanged;
}
public string YourProperty
{
get { return _Model.YourProperty; }
}
private void OnModelPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "YourProperty")
RaisePropertyChanged("YourProperty");
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
您还可以阅读http://george.softumus.com/2011/10/inotifypropertychanged-and-magic.html - 如何避免使用“魔术字符串”(硬编码常量)作为属性名称。
答案 1 :(得分:1)
自动更新UI的模型规则: -