2015-09-07 93 views
1

我使用香草WPF Datagrid有其ItemsSource绑定到DataTableWPF:刷新的DataGrid列DataTable中更改后,MVVM方式

<DataGrid AutoGenerateColumns="True" ItemsSource="{Binding ResultTable.DefaultView}" > 

哪里ResultTableDataTable。我曾尝试在运行时以编程方式添加行,DataGrid将相应更新。但是,DataGrid不会更新当我在运行时添加或删除列时。以下是我在我的视图模型

class MyViewModel : ObservableObject 
{ 
    private DataTable resultTable; 
    public DataTable ResultTable 
    { 
     get { return resultTable; } 
     set 
     { 
      resultTable = value; 
      RaisePropertyChanged("ResultTable"); 
     } 
    } 

    public void AddColumn(string columnName) 
    { 
     ResultTable.Columns.Add(columnName); 
    } 
} 

我发现了一个几乎相同的问题在这里WPF Datagrid using MVVM.. is two way binding to DataTable possible?但似乎没有成为定论。不幸的是,问这个问题的人似乎已经找到了解决办法,但没有打扰张贴它...

我也在这里找到了一个解决方案http://www.mikeware.com/2012/08/datagrid-dilemma/但它看起来很“骇人听闻”(更不用说非MVVM)作者本人也承认,如果他找到了一个,他宁可另一种方式。

如何在添加新列时强制更新DataGrid?如果可能的话,我更愿意以MVVM的方式进行。

+1

您是否尝试过重新设置整个'ResultTable'对象在你的视图模型?否则您的视图将不会被通知。你的情况有点特别,因为不仅数据发生了变化,而且还有数据变化的结构(列)。 – Martin

+0

@Martin,我试着在'ResultTable'的'set'中引发'PropertyChangedEventHandler'。然后,我通过设置“ResultTable = null”并回到原来的参考值来强制刷新。不幸的是,它没有奏效。 – DaveS

+0

看看这个:http:// stackoverflow.com/questions/15755838 /如何以编程方式添加列-wpf-datagrid -with-mvvm – dev1998

回答

1

首先这个代码添加到视图模型:

private static readonly DataTable _dt = new DataTable(); 

然后你就可以添加什么样子,当你添加列此代码:

public void AddColumn(string columnName) 
{ 
    var temp = this.ResultTable; 
    this.ResultTable = _dt; 
    temp.Columns.Add(columnName); 
    this.ResultTable = temp; 
} 
+0

我刚试过这个,它不起作用,你能解释一下这个答案吗? – DaveS

+0

你能告诉我属性'ResultTable'你怎么声明的?我的代码只是试图触发'OnPropertyChanged',所以'DataGrid'将被刷新。设置'ResultTable = null'可能无法触发它。 –

+0

我刚刚为我的问题添加了更多细节。 ObservableObject是我创建的类实现INotifyPropertyChanged – DaveS