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

将ComboBox的SelectedValue绑定到WPF中的枚举分享

时间:2023-04-10 18:49:38 C#

C#学习教程:将ComboBox的SelectedValue与WPF中的枚举绑定组合框。这是我的枚举:publicenumSelectionMode{One,Two}和Productclass:publicclassProduct{publicSelectionModeMode{get;放;}公共字符串名称{得到;放;在ViewModel类中,我有一个产品的ObservableCollection:privateObservableCollection_productList;公共ObservableCollectionProductList{get{return_productList;}设置{_productList=值;}}publicMainViewModel(){ProductList=newObservableCollection{newProduct{Mode=SelectionMode.One,Name="One"},newProduct{Mode=SelectionMode.One,Name="One"},newProduct{Mode=SelectionMode.Two,Name="Two"}};最后,我有一个Grid,其中的ListView绑定到我的ProductList:我的问题是;将ComboBoxSelectedValue绑定到Product类的SelectionMode属性的方法是什么?更新确定。我在这个线程中找到了答案。所以我不得不添加转换器类:}publicobjectConvertBack(objectvalue,TypetargetType,objectparameter,System.Globalization.CultureInfoculture){return(SelectionMode)Enum.Parse(typeof(SelectionMode),value.ToString(),true);}}并将其添加到窗口资源:最后编辑ComboBox数据模板:就是这样。希望它对其他人有用:)如果您准备好更改ComboBox的ItemsSource的绑定,那么,只需SelectedValue="{BindingMode,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"即可。在这种情况下,您必须像这样绑定ItemsSource:ItemsSource="{BindingRelativeSource={RelativeSourceFindAncestor,AncestorType={x:TypeViewClass}},Path=ModeList}";其中ModeList是SelectionMode公共属性类型的简单列表,其中包含应在ComboBox下拉列表中显示的枚举,而ViewClass是可用于此属性的类(ModeList);确保在xaml中添加对命名空间的引用。否则你必须使用转换器,它将字符串转换回枚举类型。下面我将绑定枚举用于列表/comboxpublicenumEnumsAvailable{[Description("ItsanA")]a,[Description("ItsaB")]b,[Description("ItsaC")]c,[Description("ItsaD")]d};这是我的XAML我的视频模型publicEnumsAvailableListOfEnumValues{get{returnnewEnumsAvailable();}}publicEnumsAvailableChosenEnum{get{return_ChosenEnum;}set{if(_ChosenEnum!=value){_ChosenEnum=value;RaisePropertyChanged(()=>ChosenEnum);}}}和我的转换器返回!type.IsEnum?null:base.GetEnumDescription(类型);}publicobjectConvertBack(objectvalue,TypetargetType,objectparameter,CultureInfoculture){returnnull;}}公共抽象类BaseEnumDescriptionConverter:MarkupExtension{publicoverrideobjectProvideValue(IServiceProviderserviceProvider){返回这个;}publicIEnumerableGetEnumDescription(TypedestinationType){varenumType=destinationType;varvalues=RetrieveEnumDescriptionValues(enumType);返回新列表(值);}publicobjectGetEnumFromDescription(stringdescToDecipher,TypedestinationType){vartype=destinationType;如果(!type.IsEnum)抛出新的InvalidOperationException();varstaticFields=type.GetFields().Where(fld=>fld.IsStatic);foreach(staticFields中的var字段){varattribute=Attribute.GetCustomAttribute(field,typeof(DescriptionAttribute))asDescriptionAttribute;if(attribute!=null){if(attribute.Description==descToDecipher){return(Enum.Parse(type,field.Name,true));}}else{if(field.Name==descToDecipher)returnfield.GetValue(null);}}thrownewArgumentException("在枚举列表中找不到描述。");}publicstaticstring[]RetrieveEnumDescriptionValues(TypetypeOfEnum){varvalues=Enum.GetValues(typeOfEnum);返回(从值中的对象fieldInfo选择DescriptionAttr(fieldInfo)).ToArray();}publicstaticstringDescriptionAttr(objectenumToQuery){FieldInfofi=enumToQuery.GetType().GetField(enumToQuery.ToString());DescriptionAttribute[]属性=(DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute),false);返回attributes.Length>0?属性[0].描述:enumToQuery.ToString();}publicstaticstringGetDomainNameAttribute(objectenumToQuery){FieldInfofi=enumToQuery.GetType().GetField(enumToQuery.ToString());DomainNameAttribute[]属性=(DomainNameAttribute[])fi.GetCustomAttributes(typeof(DomainNameAttribute),false);返回attributes.Length>0?属性[0].域名:enumToQuery.ToString();}}公共类DescriptionToEnumConverter:BaseEnumDescriptionConverter,IValueConverter{publicDescriptionToEnumConverter(){}publicobjectConvert(objectvalue,TypetargetType,objectparameter,System.Globalization.CultureInfoculture){返回值;}publicobjectConvertBack(objectvalue,TypetargetType,objectparameter,System.Globalization.CultureInfoculture){varenumueValue=value;if(enumValue!=null){enumValue=GetEnumFromDescription(value.ToString(),targetType);}返回枚举值;以我个人的观点,它更简洁并且高度可重用到目前为止,我发现的唯一缺陷是,如果您在代码中更新选定的值(而不是通过UI),那么它不会在UI上更新。然而,这可以通过进一步的UI调整来克服。我现在正在进行更改,完成后我会更新此答案。我正在使用一个转换器,它还允许定义将显示的字符串而不是枚举值:http://www.ageektrapped.com/blog/the-missing-net-7-displaying-enums-in-wpf/aboveC#学习教程:将ComboBox的SelectedValue与WPF中的枚举绑定,分享全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收集,不代表侵权,请点击右边联系管理员删除。如需转载请注明出处: