我的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
?
答案 0 :(得分:5)
DataTable
本身不可观察。因此,UI不会通知您所做的更改。您有几个选项来刷新数据:
DataTable
打包ObservableCollection
的条目,并将DataGrid
绑定到此集合。但是,您必须在DataTable
和ObservableCollection
之间同步数据。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>