Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在清除和重新填充数据后,DataTable未更新DataGrid。MVVM_C#_Wpf_Mvvm_Datagrid_Datatable - Fatal编程技术网

C# 在清除和重新填充数据后,DataTable未更新DataGrid。MVVM

C# 在清除和重新填充数据后,DataTable未更新DataGrid。MVVM,c#,wpf,mvvm,datagrid,datatable,C#,Wpf,Mvvm,Datagrid,Datatable,我的viewModel是: public class MainWindowViewModel { public MainWindowViewModel() { PopulateDataTable(); } private DataTable employeeDataTable; public DataTable EmployeeDataTable { get { return employeeDataTable;

我的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);        
       }
    }
}
公共类MainWindowViewModel
{
公共主窗口视图模型()
{
填充数据表();
}
私有数据表employeeDataTable;
公共数据表EmployeeDataTable
{
获取{return employeeDataTable;}
设置
{
employeeDataTable=值;
OnPropertyChanged(“EmployeeDataTable”);
}
}
私有void PopulateDataTable()
{            
var_ds=新数据集(“测试”);
employeeDataTable=新数据表();
employeeDataTable=_ds.Tables.Add(“DT”);
对于(int i=0;i<10;i++)
{
employeeDataTable.Columns.Add(“Column”+i.ToString());
}
对于(int i=0;i<15;i++)
{
var theRow=employeeDataTable.NewRow();
对于(int j=0;j<10;j++)
{
theRow[j]=“a”;
}
employeeDataTable.Rows.Add(theRow);
}
}
私有void重新填充数据表(对象obj)
{
EmployeeDataTable.Clear();
对于(int i=0;i<10;i++)
{
var theRow=employeeDataTable.NewRow();
对于(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()
时,
DataGrid
中的数据永远不会更新。如何使用
DataTable
清除和重新填充
DataGrid

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

  • 您可以使用
    可观察集合
    包装
    数据表
    的条目,并将
    数据网格
    绑定到此集合。但是,您必须在
    DataTable
    ObservableCollection
    之间同步数据
  • 在codebehind中,单击按钮时可以调用
    DataGrid.Items.Refresh()
    方法
  • 您可以将
    DataGrid
    ItemsSource
    属性设置为null,然后再次设置为您的
    DataTable
例如:

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;
}
private void重新填充数据表(object obj)
{
EmployeeDataTable.Clear();
对于(int i=0;i<10;i++)
{
var theRow=employeeDataTable.NewRow();
对于(int j=0;j<10;j++)
{
theRow[j]=j+DateTime.Now.ToString();
}
employeeDataTable.Rows.Add(theRow);
}
DataTable tempDataTable=EmployeeDataTable;
EmployeeDataTable=null;
EmployeeDataTable=临时数据表;
}
我只是重新发布。安迪的回答很有魅力:

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");
    }
公共类MainWindowViewModel:ViewModelBase { 公共主窗口视图模型() { 填充数据表(); RepopulateCommand=新的RelayCommand(RepopulateDataTable); } 私有数据表employeeDataTable; 公共数据视图员工数据视图 { 获取{return employeeDataTable.DefaultView;} } public RelayCommand重新填充命令{get;set;} 私有void PopulateDataTable() { employeeDataTable=新数据表(); 对于(int i=0;i<10;i++) { employeeDataTable.Columns.Add(“Column”+i.ToString()); } 对于(int i=0;i<15;i++) { var theRow=employeeDataTable.NewRow(); 对于(int j=0;j<10;j++) { theRow[j]=“a”; } employeeDataTable.Rows.Add(theRow); } 关于财产变更(“EmployeeDataView”); } 私有void重新填充数据表(对象obj) { employeeDataTable.Clear(); 对于(int i=0;i<10;i++) { var theRow=employeeDataTable.NewRow(); 对于(int j=0;j<10;j++) { theRow[j]=j+DateTime.Now.ToString(); } employeeDataTable.Rows.Add(theRow); } 关于财产变更(“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>