2015-09-07 91 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