刷新WPF中的视图的DataContext?

The*_*boy 5 .net c# wpf

我正在使用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中更新实际更改的属性.