清除和重新填充数据后,DataTable不会更新DataGrid。 MVVM

时间:2016-03-25 07:40:11

标签: c# wpf mvvm datagrid datatable

我的viewModel是:

 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}/>

当我按RepopulateDataTable()调用方法Button时,DataGrid中的数据永远不会更新。如何使用DataGrid清除和重新填充DataTable

2 个答案:

答案 0 :(得分:5)

DataTable本身不可观察。因此,UI不会通知您所做的更改。您有几个选项来刷新数据:

  • 您可以使用DataTable打包ObservableCollection的条目,并将DataGrid绑定到此集合。但是,您必须在DataTableObservableCollection之间同步数据。
  • 在代码隐藏中,您可以在单击按钮时调用DataGrid.Items.Refresh()方法。
  • 您可以将ItemsSource的{​​{1}}属性设置为null,然后再将DataGrid设置为<{1}}:

示例:

DataTable

答案 1 :(得分:1)

我只是重新发布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>