刷新WPF中的视图的DataContext?

时间:2011-03-31 21:16:59

标签: c# .net wpf

我正在使用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,或者我需要采用不同的方式来执行此操作?

1 个答案:

答案 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中更新实际更改的属性。