Winforms MVVM GridView 数据绑定

Winforms MVVM GridView DataBinding

我正在尝试在 MVVM 模式中使用 BindingList<T> 绑定 GridView。

在我的代码中,我绑定gridview如下:

BindingSource bindingSource = new BindingSource(Context.MyList, null);
bindingSource.CurrentChanged += Context.BindingSourceCurrentItemChanged;
// NOTE: this part is to test if the event is fired...
Context.MyList.ListChanged += myList_ListChanged;
myGrid.DataSource = bindingSource;

我有一个添加按钮,它调用上下文中的方法作为 ICommand:

Context.myCommand.Execute(null);

最后,在命令本身(在上下文 class 中),我执行以下操作:

MyList.Add(new Item());

非常直接的实现... bindingSource.CurrentChanged 确实触发了,但我从未进入 myList_ListChanged 事件。

如果我停止启动 ICommand 并添加几个项目,Context.MyList 计数确实会更新。如果我使用删除命令也会发生同样的情况...

这里有什么明显的遗漏吗???

提前致谢, N.

编辑 我意识到问题来自于我将 MyList 作为 属性 的事实,如下所示:

BindingList<T> myList;
public BindingList<T> MyList {
    get {
      if (myList == null) { myList = new BindingList<T>();}
      return myList;
    }
}

我在表单的构造函数中创建了 BindingSource,而我在 ViewModel 绑定完成后调用了以下代码:

myList = new BindingList<T>
RaisePropertyChanged("MyList");

我知道这是 WPF 的想法,它可以无缝地更新数据绑定。

据我了解,BindingSource 似乎不监听数据源本身的变化(即指向对象的指针),而不是其内容的变化。

有好心人可以确认一下这种行为吗? 谢谢! N.

要解决此问题,只需按如下方式设置对数据源的绑定:

myGrid.DataBindings.Clear(); // binding must be unique, make sure it is!    
myGrid.DataBindings.Add("DataSource", Context, "MyList");

那么,只要在"Context"级别有一个属性变化就可以了。