字典到 ListView 双向绑定 - 可能吗?
Posted
技术标签:
【中文标题】字典到 ListView 双向绑定 - 可能吗?【英文标题】:Dictionary to ListView TwoWay binding - possible? 【发布时间】:2010-12-23 01:05:34 【问题描述】:我正在尝试将 Dictionary 绑定到 ListView,该 ListView 的项目模板由具有 2 个文本框的网格组成。理想情况下,我希望能够修改 ListView 中显示的 KeyValuePair 的键和值。那可能吗?
【问题讨论】:
是的,但是如果没有像 ViewModel 这样的中间类,我想不出办法来做到这一点。直接绑定到字典是否至关重要? 首选。字典应该保存我的应用程序的设置等。 【参考方案1】:您要查找的是类似于 ObservableCollection<T>
的内容,但要查找字典。谷歌搜索了一下,从Dr. WPF on building an ObservableDictionary
找到了以下内容:
优点和缺点
当然,使用可观察字典的好处是字典可以用作数据绑定控件的 ItemsSource,并且您仍然可以像访问任何其他字典一样在代码中访问字典。它是真正的对象索引字典。 使字典可观察的想法当然存在一些固有的局限性。字典是为速度而生的。当您将可观察集合的行为强加于字典以便框架可以绑定到它时,您会增加开销。
此外,字典通过同名的不同属性公开其
Values
和Keys
集合。这些集合的类型分别为Dictionary<TKey, TValue>.ValueCollection
和Dictionary<TKey, TValue>.KeyCollection
。这些 CLR 定义的集合是不可观察的。因此,您不能直接绑定到 Values 集合或 Keys 集合并期望接收动态集合更改通知。您必须改为直接绑定到可观察字典。
现在,您可能会在更新密钥时遇到问题,因为您需要以某种方式说服字典移动您的项目。我建议使用 WPF 博士的 ObservableDictionary
,而不是使用 KeyedCollection
作为后备存储。这样,Key 是从 Item 本身派生的,并且更新会自动移动 ObservableDictionary
中的对象。
【讨论】:
我以前见过那个 ObservableDictionary,但是我没有运气 2-way 绑定到它,主要是因为 Key 是只读的 正因为如此,您应该使用 KeyedCollection,它从项目中派生密钥。这样,您绑定到包含键的 Item 属性,并且字典将相应更新(也许)。【参考方案2】:如果您查看KeyValuePair 实现,它是一个结构,其键和值都是只读属性,所以我的猜测是在这种情况下不可能进行双向绑定。
如果您创建一个继承 INotifyPropertyChange 的类,该类在您更改键时处理字典添加和删除项目,或者仅在您更改值时更改值,那么它可能会起作用。
【讨论】:
您好,我无法访问该链接。 好的,我刷新了链接,去那里点击每个 Key 和 Value 属性,你会看到它们是只读的,只有 get 被实现以上是关于字典到 ListView 双向绑定 - 可能吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Dictionary<enum, bool> 双向绑定到 WPF 中的 ListView 列?
Listview 双向绑定与 ObservableCollection