C# 在清除和重新填充数据后,DataTable未更新DataGrid。MVVM
我的viewModel是: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;
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>