我正在使用WPF应用程序并使用我自己的体系结构,它非常类似于MV-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
}
Run Code Online (Sandbox Code Playgroud)
如果不明显,上面的代码正在做的是说当Controller触发Updated事件时,调用UpdateView(对象发送者,EventArgs e).
那我遇到的问题是,第一次的更新视图()被调用时,一切工作正常,但是当它被调用第二次,在DataContext似乎依然被绑定到原来的Controller.Model.
看起来好像我必须释放DataContext,或者刷新它以便每次都绑定到Model.
Controller正在对Model执行操作,因此在调用UpdateView()时,它需要在该模型上显示新分配的值.
有什么方法我需要刷新DataContext,还是有不同的方式我需要这样做?
Cod*_*ked 11
如果要将DataContext分配给模型的同一实例,则实际上它不会"更改".WPF期望对象在状态发生变化时通过DependencyProperty属性或实现INotifyPropertyChanged来通知它.
所以如果你做的事情如下:
MyObject o = new MyObject();
o.MyString = "One";
this.DataContext = o;
// ... some time later ...
o.MyString = "Two";
this.DataContext = o;
Run Code Online (Sandbox Code Playgroud)
假设MyObject没有实现INotifyPropertyChanged,那么对DataContext的第二次赋值实际上毫无价值.您必须将DataContext设置为null,然后再次分配您的对象以使其"刷新".
但是你最好的选择是实现INotifyPropertyChanged.这最终会更有效率,因为只需要在UI中更新实际更改的属性.