WPF组合框:所选项目的来回转换有问题(在所有情况下都有效,但这次除外.)
本文关键字:有效 情况下 选项 组合 项目 有问题 转换 WPF | 更新日期: 2023-09-27 18:16:02
背景
我创建了一个简单的类,用于填充分配给组合框上ItemSource
属性的集合。当源是需要一个好的描述符文本的枚举列表时,我会使用它。
public class BindableEnumerationItem<T> : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged = delegate { };
private T _item;
public BindableEnumerationItem(T item, string displayText)
{
_item = item;
_displayText = displayText;
}
private string _displayText;
public string DisplayText
{
get { return _displayText; }
set
{
if (value != _displayText)
{
_displayText = value;
PropertyChanged(this, new PropertyChangedEventArgs("DisplayText"));
}
}
}
public T Item
{
get { return _item; }
set
{
_item = value;
PropertyChanged(this, new PropertyChangedEventArgs("Item"));
}
}
}
这是非常直接的。
接下来,在我的ViewModels中,我将关联枚举值的BindableEnumerationItem
对象列表分配给List对象。在我的初始化代码中经常定义这样的东西:
//DisplayAccountTypes is a property that I'll use as an ItemSource
DisplayAccountTypes = new List<BindableEnumerationItem<DisplayAccountType>>();
DisplayAccountTypes.Add(new BindableEnumerationItem<DisplayAccountType>(DisplayAccountType.Windows, "Windows Credentials"));
DisplayAccountTypes.Add(new BindableEnumerationItem<DisplayAccountType>(DisplayAccountType.SQL, "SQL Server"));
DisplayAccountTypes.Add(new BindableEnumerationItem<DisplayAccountType>(DisplayAccountType.Linux, "Linux"));
接下来,我在xaml中创建一个ComboBox
。假设上面的初始化片段来自视图模型,该视图模型是我的xaml对象上的DataContext
对象。
<ComboBox x:Name="ComboboxAccountType"
ItemsSource="{Binding DisplayAccountTypes}"
SelectedItem="{Binding SelectedDisplayAccountType}"
DisplayMemberPath="DisplayText"
SelectedValuePath="Item" >
仅供参考,SelectedDisplayAccountType
是我的VM上的一个枚举属性。
问题
现在,我已经一次又一次地使用这个设置了。这样做效果很好。我可以切换组合框的值,它会在后端更新。然而,在我最近的实现中,当我尝试使用当前的组合框时,我遇到了以下错误。
System.Windows.Data错误:23:无法转换
MyApp.ViewModel.Helpers.BindableEnumerationItem`1[MyApp.ViewModel.DisplayAccountType]
从类型BindableEnumerationItem`1
到类型默认情况下"en-US"区域性的MyApp.ViewModel.DisplayAccountType
转换;请考虑使用Binding的Converter属性。NotSupportedException:"System.NotSupportedException:EnumConverter"无法从转换CCD_ 9,MyApp.ViewModel,版本=1.0.0.0,区域性=中性,PublicKeyToken=null]]。在System.ComponentModel.TypeConverter.GetConvertFromException(对象值(System.ComponentModel.TypeConverter.ConvertFrom(ITypeDescriptorContext上下文,CultureInfo区域性,Object值(System.ComponentModel.EnumConverter.ConvertFrom(ITypeDescriptorContext上下文,CultureInfo区域性,Object值(MS.Internal.Data.DefaultValueConverter.ConvertHelper(对象o,类型destinationType,DependencyObject targetElement,CultureInfo区域性,布尔值isForward('System.Windows.Data错误:7:ConvertBack无法转换值
MyApp.ViewModel.Helpers.BindableEnumerationItem`1[MyApp.ViewModel.DisplayAccountType]
(类型BindableEnumerationItem`1
(。BindingExpression:Path=SelectedDisplayAccountType;DataItem="凭证管理视图模型"(HashCode=58609412(;目标元素为"ComboBox"(名称="ComboboxAccountType"(;目标属性为"SelectedItem"(类型为"Object"(NotSupportedException:"System.NotSupportedException:EnumConverter"无法从转换MyApp.ViewModel.Helpers.BindableEnumerationItem`1[[MyApp.VViewModel.DisplayAccountType,MyApp.ViewModel,版本=1.0.0.0,区域性=中性,PublicKeyToken=null]]。在MS.Internal.Data.DefaultValueConverter.ConvertHelper(对象o,类型destinationType,DependencyObject targetElement,CultureInfo区域性,布尔值isForward(MS.Internal.Data.ObjectTargetConverter.ConvertBack(对象o,类型类型,Object参数,CultureInfo区域性(System.Windows.Data.BindingExpression.ConvertBackHelper(IValueConverterconverter,Object值,Type sourceType,Object参数,CultureInfo文化('
这件事困扰了我好几个小时。我没有做什么特别的事。事实上,上面的代码就是被破坏的生产代码。我可以复制&粘贴我使用这个设置的另一个例子,然而,除了每个属性/选择器各自的上下文的名称/值不同之外,它们几乎完全相同。
我理解这些错误是在说什么,但就我所做的而言,它们没有意义。我并没有试图从BindableEnumerationItem
转换为我的枚举。我应该绑定到我的BindableEnumerationItem
上的Item
属性,它当然应该是我的枚举。
也许我只需要多一双眼睛,但我找不到问题。非常感谢。
问题是您的项的类型是BindableEnumerationItem<DisplayAccountType>
,但您将SelectedItem
绑定到类型为DisplayAccountType
的属性。
有四种解决方案:
- 请改用
SelectedIndex
- 请改用
SelectedValue
- 将
DisplayAccountTypes
设为DisplayAccountType
项的集合 - 将
SelectedDisplayAccountType
设为BindableEnumerationItem<DisplayAccountType>
类型