XAML 如何正确地将Dictionary〈int,foo>绑定到Datagrid并反映更改

66bbxpm5  于 2023-05-04  发布在  其他
关注(0)|答案(1)|浏览(125)

请原谅我的英语不好,我会尽我最大的努力。

说明这个想法是创建一个“foo”的数据库1,用户可以添加/删除/编辑对象。(foo包含一个唯一的ID)这个database 1随后在程序中用于填充第二种类型的Collection。我们称之为Database 2。Database 2包含从用户选择的一个对象foo继承的元素。由于用户可以编辑对象foo,因此我可以将修改发送到Database 2以保持对象更新。但是,我有两个嵌套循环。随着数据库的增长,我可能会遇到性能问题。(我不想通过引用传递foo的属性(这会更容易),因为foo是版本化的。用户可以选择是否更新最终对象)
我想要的为了避免这种情况,我希望Database 1是〈int,foo〉的Dictionary(int是foo的唯一ID)。通过使用Dictionary,我认为检查修改的过程会更快,因为我不需要迭代Database 1
问题我有一个ObservableCollection的第一个版本绑定到一个正常工作的数据网格(用户可以添加/删除/编辑对象foo,并且更改会正确反映在UI上)。为了在Dictionary中实现Database 1,我做了所有的修改,现在我面临的唯一问题是这些修改没有反映在UI上

只有当我更改选项卡并返回时,或者当我按列对数据网格进行排序时,UI才会更新,但不会实时更新(在添加元素后直接更新)

是否有一种方法可以在字典中实现NotifyPropertyChanged或类似的东西?我怎么能那么做?

这就是数据库1
public Dictionary<int, ToolType> DicToolType { get; set; } = new Dictionary<int, ToolType>();
用户控件中的数据上下文设置正确
这就是XAML。所有绑定都很好。从另一个对话框添加新元素

<DataGrid ItemsSource="{Binding DicToolType}"
                      AutoGenerateColumns="False"
                      CanUserAddRows="False"
                      CanUserDeleteRows="False"
                      CanUserReorderColumns="False"
                      IsReadOnly="True">
                <DataGrid.Columns>
                    <DataGridTextColumn FontSize="12" Width="60"
                                        Header="T" Binding="{Binding Key}"/>
                    <DataGridTextColumn FontSize="12" Width="100"
                                        Header="Name" Binding="{Binding Value.Name}"/>
                    <DataGridTextColumn FontSize="12" Width="90"
                                        Header="Type" Binding="{Binding Value.Type}"/>
                </DataGrid.Columns>
            </DataGrid>
to94eoyn

to94eoyn1#

经过一段时间的研究,我找到了解决方案。
我创建了一个名为“ObservableDictionary”的新类,实现了INotifyCollectionChanged & IDictionary〈TKey,TValue〉

public class ObservableDictionary<TKey, TValue> : IDictionary<TKey, TValue>, INotifyCollectionChanged
{
    private Dictionary<TKey, TValue> _dic = new Dictionary<TKey, TValue>();
    #region [INotifyCollectionChanged Implementation]    
    public event NotifyCollectionChangedEventHandler CollectionChanged = delegate { };
    public void OnCollectionChanged(NotifyCollectionChangedAction action)
    {
        if (CollectionChanged != null)
        {
            CollectionChanged(this, new NotifyCollectionChangedEventArgs(action));
        }
    }
    #endregion
    #region [IDictionary Implementation]
//...
    public void Add(TKey key, TValue value)
    {
        _dic.Add(key, value);
        OnCollectionChanged(NotifyCollectionChangedAction.Reset);
    }
//...
    #endregion
}

现在添加新项会反映在UI中
Implementing INotifyCollectionChanged interface
https://social.msdn.microsoft.com/Forums/en-US/2ec0c111-0682-49c8-a9d8-ae374328ea2e/bind-observable-dictionary?forum=wpf

相关问题