【问题标题】:WPF Datagrid using MVVM.. is two way binding to DataTable possible?使用 MVVM 的 WPF Datagrid .. 是否可以通过两种方式绑定到 DataTable?
【发布时间】:2011-01-06 21:50:37
【问题描述】:

我的视图中有一个数据网格,它的 ItemSource 绑定到我的 ViewModel 中的 DataTable。当我以编程方式更新 DataTable(通过命令添加列)时,更改不会填充到视图中。此外,如果我通过切换到另一个选项卡然后切换回来使视图无效,则会显示所做的更改。

我的 ViewModel 继承自 INotifyPropertyChanged,我正确地引发了 PropertyChanged 事件,因为我对 ViewModel 中的其他绑定属性使用相同的过程并且它们按预期工作。

是否可以让数据网格反映我使用 MVVM 模式对绑定 DataTable 所做的更改?

是否有数据网格事件可以用来刷新视图代码中的数据网格?

感谢您的帮助! -史蒂文

【问题讨论】:

    标签: wpf datagrid mvvm datatable wpfdatagrid


    【解决方案1】:

    虽然在 DataTable 中修改行和编辑单元格内容会反映在 DataGrid 中(对我有用),但 ColumnChanges 似乎并非如此。如果您使用的是 AutoGenerateColumns 选项,那么我想它会在初始化时这样做,但之后不会注意更改。

    如果您可以找到在将列添加到 DataTable 时触发的事件(我没有注意到),那么您可以在后面的代码中手动添加它。另一个可能可行或不可行的技巧是将您的 DataTable 属性设置为 null,然后将您的属性重新设置为 DataTable,每次调用 OnPropertyChanged。这应该会强制重建 DataGrid。

    private DataTable _myDataTable;
    
    public DataTable MyDataTable
    {
       get { return _myDataTable; }
       set
       {
            _myDataTable = value;
            OnPropertyChanged("MyDataTable");
       }
    }
    
    void SomeMethod()
    {
         ....results in column changes
         DataTable holder;
         holder = MyDataTable
         MyDataTable = null;
         MyDataTable = holder;         
    }
    

    【讨论】:

    • 我找到了一种使您的解决方法适用于我的方案的方法。我不知道为什么我自己没有尝试这个,但无论如何我感谢你的时间和帮助。谢谢!
    【解决方案2】:

    您必须使用 ObservableCollection 类型来与 DataGrid 绑定。在此之前,您的 DataGrid 可以更新 ViewModel 中 DataTable 的更改。

    当您绑定类型而不是 ObservableCollection 时,引发 PropertyChanged 事件似乎没用。

    【讨论】:

      猜你喜欢
      • 2021-03-01
      • 2018-02-07
      • 2023-04-02
      • 1970-01-01
      • 2013-03-24
      • 2011-03-06
      • 2013-06-20
      • 2019-12-22
      • 2017-02-11
      相关资源
      最近更新 更多