我正在使用WPF应用程序并使用我自己的非常类似于M-V-VM / MVC的架构。我有每个视图的控制器,我有ViewModel绑定到视图。
例如,我有一个ToolBarView,它有一个相应的ToolBarViewModel和ToolBar Controller。
我正在使用通知更新所有视图,以便他们不需要互相引用,但这与我的问题无关。
每个视图都在监听模型更新后在其控制器中触发的事件。在ToolBarView中,如下所示。
/*In Constructor in ToolbarView*/
Controller.Updated += UpdateView
/*Event Handler in ToolbarView*/
private void Updateview(object sender,EventArgs e)
{
DataContext = Controller.Model;
//Other Updating if needed
}
如果不明显,上面的代码正在做的是说当Controller触发Updated事件时,调用UpdateView(对象发送者,EventArgs e)。
我遇到的问题是第一次调用UpdateView()时,一切正常,但是当第二次调用它时,DataContext似乎仍然绑定到原始的Controller.Model。
似乎我必须释放DataContext,或者刷新它以便每次都绑定到Model。
Controller正在对Model执行操作,因此在调用UpdateView()时,它需要在该模型上显示新分配的值。
我是否需要某种方式来刷新DataContext,或者我需要采用不同的方式来执行此操作?
答案 0 :(得分:11)
如果要将DataContext分配给模型的同一实例,则实际上它不会“更改”。 WPF期望对象在状态发生变化时通过DependencyProperty属性或实现INotifyPropertyChanged来通知它。
所以,如果你做了类似的事情:
MyObject o = new MyObject();
o.MyString = "One";
this.DataContext = o;
// ... some time later ...
o.MyString = "Two";
this.DataContext = o;
假设MyObject没有实现INotifyPropertyChanged,那么对DataContext的第二次赋值实际上毫无价值。您必须将DataContext设置为null,然后再次分配您的对象以使其“刷新”。
但总的来说,最好的选择是实施INotifyPropertyChanged。这最终会更有效率,因为只需要在UI中更新实际更改的属性。