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属性,它当然应该是我的枚举。

也许我只需要多一双眼睛,但我找不到问题。非常感谢。

WPF组合框:所选项目的来回转换有问题(在所有情况下都有效,但这次除外.)

问题是您的项的类型是BindableEnumerationItem<DisplayAccountType>,但您将SelectedItem绑定到类型为DisplayAccountType的属性。

有四种解决方案:

  1. 请改用SelectedIndex
  2. 请改用SelectedValue
  3. DisplayAccountTypes设为DisplayAccountType项的集合
  4. SelectedDisplayAccountType设为BindableEnumerationItem<DisplayAccountType>类型
相关文章: