2016-03-25 12 views
0

私のViewModelには、次のとおりです。DataTableは、データの消去と再充填後にDataGridを更新していません。 MVVM

public class MainWindowViewModel 
{ 
    public MainWindowViewModel() 
    { 
     PopulateDataTable(); 
    } 
    private DataTable employeeDataTable; 
    public DataTable EmployeeDataTable 
    { 
     get { return employeeDataTable; } 
     set 
     { 
      employeeDataTable = value; 
      OnPropertyChanged("EmployeeDataTable"); 
     } 
    } 

    private void PopulateDataTable() 
    {    
     var _ds = new DataSet("Test"); 
     employeeDataTable = new DataTable(); 
     employeeDataTable = _ds.Tables.Add("DT"); 
     for (int i = 0; i < 10; i++) 
     { 
      employeeDataTable.Columns.Add("Column " + i.ToString()); 
     } 
     for (int i = 0; i < 15; i++) 
     { 
      var theRow = employeeDataTable.NewRow(); 
      for (int j = 0; j < 10; j++) 
      { 
       theRow[j] = "a";     
      } 
      employeeDataTable.Rows.Add(theRow); 
     } 
    } 

    private void RepopulateDataTable(object obj) 
    { 
      EmployeeDataTable.Clear(); 
      for (int i = 0; i < 10; i++) 
      { 
       var theRow = employeeDataTable.NewRow(); 
       for (int j = 0; j < 10; j++) 
       { 
        theRow[j] = j + DateTime.Now.ToString(); 
       } 
       employeeDataTable.Rows.Add(theRow);   
     } 
    } 
} 

私のXAMLは次のとおりです。

<DataGrid ItemsSource="{Binding EmployeeDataTable, IsAsync=True}" /> 
<Button Content="Update DataGrid" Command={Binding UpdateDataGridCommand}/> 

私はButtonによる方法RepopulateDataTable()を呼び出すと、その後、DataGrid内のデータが更新されません。 DataTableを使用してDataGridをクリアして再投入するにはどうすればよいですか?

答えて

0

私はちょうどAndy ONeill's answer from WPF MSDN forumを再投稿しています。アンディの答えは魔法のように動作:

public class MainWindowViewModel:ViewModelBase 
{ 
    public MainWindowViewModel() 
    { 
     PopulateDataTable(); 
     RepopulateCommand = new RelayCommand(RepopulateDataTable); 
    } 
    private DataTable employeeDataTable; 
    public DataView EmployeeDataView 
    { 
     get { return employeeDataTable.DefaultView; } 
    }  

    public RelayCommand RepopulateCommand { get; set; } 


    private void PopulateDataTable() 
    { 
     employeeDataTable = new DataTable(); 
     for (int i = 0; i < 10; i++) 
     { 
      employeeDataTable.Columns.Add("Column " + i.ToString()); 
     } 
     for (int i = 0; i < 15; i++) 
     { 
      var theRow = employeeDataTable.NewRow(); 
      for (int j = 0; j < 10; j++) 
      { 
       theRow[j] = "a"; 
      } 
      employeeDataTable.Rows.Add(theRow); 
     } 
     OnPropertyChanged("EmployeeDataView"); 
    } 

    private void RepopulateDataTable(object obj) 
    { 
     employeeDataTable.Clear(); 
     for (int i = 0; i < 10; i++) 
     { 
      var theRow = employeeDataTable.NewRow(); 
      for (int j = 0; j < 10; j++) 
      { 
       theRow[j] = j + DateTime.Now.ToString(); 
      } 
      employeeDataTable.Rows.Add(theRow); 
     } 
     OnPropertyChanged("EmployeeDataView"); 
    } 

およびXAML:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="30"/> 
    </Grid.RowDefinitions> 
    <DataGrid ItemsSource="{Binding EmployeeDataView}"/> 
    <Button Grid.Row="1" 
      Content="RePopulate" 
      Command="{Binding RepopulateCommand}"/>    
</Grid> 
4

DataTable自体が観測可能ではありません。そのため、UIには変更内容が通知されません。

  • あなたはObservableCollectionDataTableのエントリをラップし、あなたのDataGridこのコレクションにバインドすることができます:あなたは、データを更新するには、いくつかのオプションがあります。しかし、DataTableObservableCollectionの間でデータを同期させる必要があります。あなたのボタンがクリックされたときに、あなたがDataGrid.Items.Refresh()メソッドを呼び出すことができます分離コードで
  • あなたのDataTableに再びヌルとするDataGridItemsSourceプロパティを設定することができます。

例:

private void RepopulateDataTable(object obj) 
{ 
    EmployeeDataTable.Clear(); 
    for (int i = 0; i < 10; i++) 
    { 
     var theRow = employeeDataTable.NewRow(); 
     for (int j = 0; j < 10; j++) 
     { 
      theRow[j] = j + DateTime.Now.ToString(); 
     } 
     employeeDataTable.Rows.Add(theRow);   
    } 

    DataTable tempDataTable = EmployeeDataTable; 
    EmployeeDataTable = null; 
    EmployeeDataTable = tempDataTable; 
} 
関連する問題