【问题标题】:C# WPF DataGrid with user input and update the variables accordingly带有用户输入的 C# WPF DataGrid 并相应地更新变量
【发布时间】:2018-08-21 09:54:35
【问题描述】:

我有一个DataGrid和“MyNewEntry”类,并且这个类实现了INotifyPropertyChanged,所以字典中的每一次变化,也会影响datagrid中显示的值。

请参阅下面的代码。

Dictionary<string, MyNewEntry> dicForMyNewEntrys = new Dictionary<string, MyNewEntry>();

ObservableCollection<MyNewEntry> entryRowMyNewEntrys = new ObservableCollection<MyNewEntry>();

myDataGrid.ItemsSource = entryRowMyNewEntrys;

我想根据用户输入更新字典。

  1. 当用户添加新行时

  2. 当用户从数据网格中删除行时

  3. 当用户编辑一些数据网格单元时

对于 3 号,我可以捕捉到事件 CellEditEnding(可能有更好的方法来做到这一点),但对于其余的,我不知道如何以一种好的方式做到这一点。

【问题讨论】:

  • DataGrid 自动完成所有这些工作。只需将适当的元素(例如 DataGridTextColum)绑定到 MyNewEntry 类的属性。可能先阅读 DataGrid 教程。
  • 我知道 ObservableCollection 将由 ui 更新。我想要做的也是更新字典。因为我的代码的某处正在使用字典,但字典没有用用户输入更新。
  • 只需注册CollectionChanged 事件并从那里更新您的Dictionary

标签: c# wpf datagrid


【解决方案1】:

当您编辑DataGrid 中的某个单元格时,您实际上是在设置MyNewEntry 类的相应属性。所以如果你像这样创建源集合,字典中的值应该会自动更新:

ObservableCollection<MyNewEntry> entryRowMyNewEntrys = new ObservableCollection<MyNewEntry>(dicForMyNewEntrys.Values);

为了能够解决1和2,您可以处理ObservableCollection&lt;MyNewEntry&gt;CollectionChanged事件,例如:

entryRowMyNewEntrys.CollectionChanged += (s, e) =>
{
    switch (e.Action)
    {
        case NotifyCollectionChangedAction.Add:
            MyNewEntry added = e.NewItems?.OfType<MyNewEntry>().FirstOrDefault();
            string key = "...";
            if (added != null && !dicForMyNewEntrys.ContainsKey(key))
                dicForMyNewEntrys.Add(key, added);
            break;
        case NotifyCollectionChangedAction.Remove:
            MyNewEntry removed = e.OldItems?.OfType<MyNewEntry>().FirstOrDefault();
            key = "...";
            if (removed != null && dicForMyNewEntrys.ContainsKey(key))
                dicForMyNewEntrys.Remove(key);
            break;
    }
};

【讨论】:

猜你喜欢
  • 2015-07-30
  • 1970-01-01
  • 2014-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多