UI中的“已更新”通知属性

时间:2012-03-07 08:35:20

标签: c# silverlight mvvm

我有一个由三个类组成的模型: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中我不能使用“快捷方式”??或者如果我使用它们,我应该注册属性的通知并“传播”它们吗?

2 个答案:

答案 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的模型规则: -

  1. 您的Collection类型的属性必须是ObservableCollection类型
  2. 您的模型应实现INotifyPropertyChanged接口
  3. 模型的每个属性,除非是字符串或值类型,必须是应该实现INotifyPropertyChanged的类型
  4. 如果您的value属性类型更改,它应触发PropertyChanged作为属性名称,即使它是从ObservableCollection派生的