当前位置: 首页 > 编程语言 > C#

WPF中的双向数据绑定和字典共享

时间:2023-04-10 17:57:51 C#

WPF中的双向数据绑定和字典我想在WPF中将字典绑定到ListView。我想通过数据绑定机制更新Dictionary中的Values来做到这一点。我不想只更改密钥。我也不关心在字典中添加新的映射。我只想更新现有的。将字典设置为ListView的ItemsSource并不能实现这一点。它不起作用,因为ListView使用Enumerator来访问Dictionary的内容,并且该枚举的元素是不可变的KeyValuePair对象。我当前的查询行是尝试使用Keys属性。我将它分配给ListView的ItemsSource属性。这让我可以显示Keys但是我不太明白WPF的数据绑定机制来访问Dictionary的Values。我发现了这个问题:AccessingcodebehindvariablesinXAMLbutstillcan'tclosingthegap。你们有人知道如何使这项工作吗?有人有更好的方法吗?看来,作为最后的手段,我可??以构建一个自定义对象并将其粘贴到一个列表中,我可以从中重新创建/更新我的字典,但这似乎是一种绕过内置数据绑定功能的方法,而不是有效地使用它。我不认为你可以用字典做你想做的事。因为Dictionary没有实现INotifyPropertyChanged或INotifyCollectionChanged因为它不允许像你想要的那样进行双向绑定。我不确定它是否完全符合您的要求,但我会使用ObservableCollection和自定义类。我正在使用DataTemplate来展示如何以两种方式绑定值。当然这个实现中没有使用Key,所以可以使用ObservableCollectioncustomclasspublicclassMyCustomClass{publicstringKey{get;放;}publicint值{得到;放;}}设置ItemsSourceObservableCollectiondict=newObservableCollection();dict.Add(newMyCustomClass{Key="test",Value=1});dict.Add(newMyCustomClass{Key="test2",Value=2});listView.ItemsSource=dict;XAML这有点老套,但我让它工作了(假设我明白你想要什么)。我首先创建了一个视频模型类:classViewModel:INotifyPropertyChanged{publicViewModel(){this.data.Add(1,"One");this.data.Add(2,"二");this.data.Add(3,"三");}字典数据=newDictionary();publicIDictionaryData{get{returnthis.data;}}私有键值对?选择键=空;公钥值对?SelectedKey{得到{返回this.selectedKey;}设置{this.selectedKey=value;this.OnPropertyChanged("SelectedKey");this.OnPropertyChanged("SelectedValue");}}publicstringSelectedValue{get{if(null==this.SelectedKey){returnstring.Empty;}返回this.data[this.SelectedKey.Value.Key];}设置{this.data[this.SelectedKey.Value.Key]=value;this.OnPropertyChanged("SelectedValue");}}公共事件PropertyChangedEventHandlerPropertyChanged;privatevoidOnPropertyChanged(stringpropName){vareh=this.PropertyChanged;if(null!=eh){eh(this,newPropertyChangedEventArgs(propName));}}}然后在XAML中:数据属性的绑定到ListBox的ItemsSource正如您在问题中所述,这导致使用KeyValuePair实例作为ListBox背后的数据。我将DisplayMemberPath设置为Key,这样key的值将用作ListBox的每个项目的显示值。如您所见,您不能只使用KeyValuePair的值作为TextBox的数据,因为它是只读的。相反,TextBox绑定到视图模型上的一个属性,该属性可以获取和设置当前选定键的值(通过将ListBox的SelectedItem属性绑定到视图模型上的另一个属性来更新)。我必须使此属性可为空(因为KeyValuePair是一个结构),以便代码可以检测何时没有选择。在我的测试应用程序中,这似乎会导致对TextBox的编辑传播到视图模型中的Dictionary。这或多或少是你想要的吗?看起来它应该更干净,但我不确定是否有任何方法可以做到这一点。只是张贴我从上面得到的。您可以将以下内容放入您的ObservableCollection>中,使密钥只读,因为密钥可能不应更改。这需要Prism才能工作——或者您可以实现您自己的INotifyPropertyChanged版本publicclassObservableKvp:BindableBase{publicKKey{get;}私有V_value;公共V价值{得到{返回_value;}set{SetProperty(ref_value,value);}}publicObservableKvp(Kkey,Vvalue){Key=key;价值=价值;}}你可以用它代替字典吗?字典?让IntWrapperClass实现INotifyPropertyCHanged。然后,您可以双向将列表视图/列表框绑定到字典中的项目。以上就是C#学习教程的全部内容:WPF中的双向数据绑定和字典共享。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: