【问题标题】:WPF Datagrid: Update itemssource the simple wayWPF Datagrid:以简单的方式更新 itemssource
【发布时间】:2016-11-17 12:09:33
【问题描述】:

首先,我通常使用 MVVM 或 MVVMC 编写代码,但是对于一个非常简单的项目,我想尝试以“旧方式”来做所有事情,这意味着只使用逻辑背后的代码编写一个简单易懂的应用程序,而不是INotifyPropertyChanged 接口。

为此,我创建了一个非常简单的 Employee 示例应用程序,其中包含一个将员工列表加载到 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
    }

【问题讨论】:

    标签: c# wpf datagrid code-behind


    【解决方案1】:

    不要创建新的_MyList.Employees 集合实例。

    而是清除并重新填充现有的:

    _MyList.Employees.Clear();
    
    for (var employee in employeesFromFile)
    {
        _MyList.Employees.Add(employee);
    }
    

    由于您没有为_MyGrid.ItemsSource 使用绑定,因此也没有必要设置_MyGrid.DataContext

    【讨论】:

      【解决方案2】:

      如果您使用的是ObservableCollection,那么DataGrid 将自行更新而不会出现任何额外问题。

      但如果您使用的是List&lt;Employee&gt;,那么您需要重新分配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;
              }
          }
      

      【讨论】:

        【解决方案3】:

        您可以通过为数据网格分配空值来删除现有的项目源,然后分配更新的项目源,例如,

        _MyGrid.ItemsSource = null;
        _MyGrid.ItemsSource = _MyList.Employees;
        

        【讨论】:

          猜你喜欢
          • 2011-04-22
          • 2010-11-09
          • 2012-06-22
          • 1970-01-01
          • 2014-10-05
          • 1970-01-01
          • 2018-06-28
          • 2013-04-21
          • 2013-06-30
          相关资源
          最近更新 更多