WPF Datagrid:以简单的方式更新 itemssource
WPF Datagrid: Update itemssource the simple way
首先,我通常使用 MVVM 或 MVVMC 编写代码,但对于一个非常简单的项目,我想尝试做 "old way" 的所有事情,这意味着只使用代码隐藏逻辑编写一个易于理解的应用程序, 并且没有 INotifyPropertyChanged 接口。
为此,我创建了一个非常简单的员工示例应用程序,其中 class 将员工列表加载到 Obersvablecolletion。问题是:在我设置 Itemssource 和 DataContext 之后,在加载之后,我的 DataGrid 没有得到更新。当然我可以在加载后再次设置 DataContext,但是有更好的方法吗?某种方式告诉后面的代码中的 DataGrid 它的内容已更改并使它们无效?
这是我的示例代码:
public partial class MainWindow : Window
{
private EmployeeList _MyList;
public MainWindow()
{
InitializeComponent();
_MyList= new EmployeeList();
_MyList.Employees = new ObservableCollection<Employee>();
_MyGrid.DataContext = _MyList;
_MyGrid.ItemsSource = _MyList.Employees;
}
private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
private void _AddButton_Click(object sender, RoutedEventArgs e)
{
AddWindow newWindow = new AddWindow();
if (newWindow.ShowDialog() == true)
{
_MyList.Employees.Add(newWindow.NewEmployee);
}
}
private void _LoadButton_Click(object sender, RoutedEventArgs e)
{
_MyList.Load();
//Creates new_MyList.Employees and fills with content from a file. After that, my DataGrid does not get updated
}
不要创建新的 _MyList.Employees
集合实例。
而是清除并重新填充现有的:
_MyList.Employees.Clear();
for (var employee in employeesFromFile)
{
_MyList.Employees.Add(employee);
}
由于您没有为 _MyGrid.ItemsSource
使用绑定,因此也没有必要设置 _MyGrid.DataContext
。
如果您使用的是 ObservableCollection
,那么 DataGrid
会自行更新而不会出现任何额外问题。
但是如果您使用的是 List<Employee>
,那么您需要重新分配 ItemsSource
,如下所示:
private void _AddButton_Click(object sender, RoutedEventArgs e)
{
AddWindow newWindow = new AddWindow();
if (newWindow.ShowDialog() == true)
{
_MyList.Employees.Add(newWindow.NewEmployee);
// re-assign the `ItemsSource`
_MyGrid.ItemsSource = null;
_MyGrid.ItemsSource = _MyList.Employees;
}
}
您可以通过为数据网格分配空值来删除现有的项目源,然后分配更新的项目源,例如,
_MyGrid.ItemsSource = null;
_MyGrid.ItemsSource = _MyList.Employees;
首先,我通常使用 MVVM 或 MVVMC 编写代码,但对于一个非常简单的项目,我想尝试做 "old way" 的所有事情,这意味着只使用代码隐藏逻辑编写一个易于理解的应用程序, 并且没有 INotifyPropertyChanged 接口。
为此,我创建了一个非常简单的员工示例应用程序,其中 class 将员工列表加载到 Obersvablecolletion。问题是:在我设置 Itemssource 和 DataContext 之后,在加载之后,我的 DataGrid 没有得到更新。当然我可以在加载后再次设置 DataContext,但是有更好的方法吗?某种方式告诉后面的代码中的 DataGrid 它的内容已更改并使它们无效?
这是我的示例代码:
public partial class MainWindow : Window
{
private EmployeeList _MyList;
public MainWindow()
{
InitializeComponent();
_MyList= new EmployeeList();
_MyList.Employees = new ObservableCollection<Employee>();
_MyGrid.DataContext = _MyList;
_MyGrid.ItemsSource = _MyList.Employees;
}
private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
private void _AddButton_Click(object sender, RoutedEventArgs e)
{
AddWindow newWindow = new AddWindow();
if (newWindow.ShowDialog() == true)
{
_MyList.Employees.Add(newWindow.NewEmployee);
}
}
private void _LoadButton_Click(object sender, RoutedEventArgs e)
{
_MyList.Load();
//Creates new_MyList.Employees and fills with content from a file. After that, my DataGrid does not get updated
}
不要创建新的 _MyList.Employees
集合实例。
而是清除并重新填充现有的:
_MyList.Employees.Clear();
for (var employee in employeesFromFile)
{
_MyList.Employees.Add(employee);
}
由于您没有为 _MyGrid.ItemsSource
使用绑定,因此也没有必要设置 _MyGrid.DataContext
。
如果您使用的是 ObservableCollection
,那么 DataGrid
会自行更新而不会出现任何额外问题。
但是如果您使用的是 List<Employee>
,那么您需要重新分配 ItemsSource
,如下所示:
private void _AddButton_Click(object sender, RoutedEventArgs e)
{
AddWindow newWindow = new AddWindow();
if (newWindow.ShowDialog() == true)
{
_MyList.Employees.Add(newWindow.NewEmployee);
// re-assign the `ItemsSource`
_MyGrid.ItemsSource = null;
_MyGrid.ItemsSource = _MyList.Employees;
}
}
您可以通过为数据网格分配空值来删除现有的项目源,然后分配更新的项目源,例如,
_MyGrid.ItemsSource = null;
_MyGrid.ItemsSource = _MyList.Employees;