C# 绑定到枚举值的IEnumerable时WPF组合框验证错误

C# 绑定到枚举值的IEnumerable时WPF组合框验证错误,c#,wpf,xaml,combobox,enums,C#,Wpf,Xaml,Combobox,Enums,出于代码重用的目的,我试图将组合框ItemsSource绑定到viewmodel中定义的枚举值的可枚举项。(我知道直接绑定到枚举的策略,但为了实现代码重用,我需要绑定到一个枚举。)在viewmodel构造上,我将所选项设置为枚举的第一个值。但是,当UI首次启动时,组合框会加载验证错误: 无法转换值“” 当我使用相同的XAML绑定到可枚举的类时,不会发生此错误。选择枚举值后,不会再出现验证错误,UI将按预期工作如何避免此错误并使组合框在启动时显示所选项目? 代码详细信息。。。我有一个实现iaqui

出于代码重用的目的,我试图将组合框ItemsSource绑定到viewmodel中定义的枚举值的可枚举项。(我知道直接绑定到枚举的策略,但为了实现代码重用,我需要绑定到一个枚举。)在viewmodel构造上,我将所选项设置为枚举的第一个值。但是,当UI首次启动时,组合框会加载验证错误:

无法转换值“”

当我使用相同的XAML绑定到可枚举的类时,不会发生此错误。选择枚举值后,不会再出现验证错误,UI将按预期工作如何避免此错误并使组合框在启动时显示所选项目?

代码详细信息。。。我有一个实现
iaquire
的服务,它返回枚举值的可枚举性:

public interface IAcquire<T>
{
    IReactiveList<T> Items { get; }
}
公共接口IAQUIRE
{
IReactiveList项{get;}
}
我的viewmodel继承如下所示:

    class GranularitySelectionViewModel : ChartFilterSelectionBase<DataGranularity>
    {
        public GranularitySelectionViewModel([NotNull] IAcquire<DataGranularity> service) 
            : base(service, "Granularity")
        {}
    }


class ChartFilterSelectionBase<T> : SelectionViewModelBase
{
    private readonly IAcquire<T> _service;

    internal ChartFilterSelectionBase([NotNull] IAcquire<T> service, string label)
        :base(label)
    {
            foreach (var value in service.Items)
            {
                Items.Add(value);
            }
            SelectedItem = Items.FirstOrDefault();
    }

    private readonly IReactiveList<T> _items = new ReactiveList<T>();

    public new IReactiveList<T> Items
    {
        get { return _items; }
    }

    private T _selectedItem;

    public new T SelectedItem
    {
        get { return _selectedItem; }
        set { SetProperty(ref _selectedItem, value); }
    }
}

public class SelectionBaseViewModel
{
    protected SelectionBaseViewModel([NotNull] string label )
    {
        if (label == null) throw new ArgumentNullException("label");
        _label = label;
    }

    private readonly string _label;

    public string Label
    {
        get { return _label; }
    }

    //Placeholder to be overridden in derived class.
    public object SelectedItem { get; set; }

    //Placeholder to be overridden in derived class.
    public IReactiveList<object> Items { get; private set; }
}
类粒度选择视图模型:ChartFilterSelectionBase
{
公共粒度SelectionViewModel([NotNull]iQuire服务)
:base(服务,“粒度”)
{}
}
类ChartFilterSelectionBase:SelectionViewModelBase
{
专用只读IAcquire\u服务;
内部ChartFilterSelectionBase([NotNull]iQuire服务,字符串标签)
:底座(标签)
{
foreach(服务项目中的var值)
{
增加(价值);
}
SelectedItem=Items.FirstOrDefault();
}
私有只读IReactiveList_items=new ReactiveList();
公共新活动列表项
{
获取{return\u items;}
}
私人T_selectedItem;
公共新T SelectedItem
{
获取{return\u selectedItem;}
set{SetProperty(ref _selectedItem,value);}
}
}
公共类SelectionBaseViewModel
{
受保护的SelectionBaseViewModel([NotNull]字符串标签)
{
如果(label==null)抛出新的ArgumentNullException(“label”);
_标签=标签;
}
私有只读字符串_标签;
公共字符串标签
{
获取{return\u label;}
}
//要在派生类中重写的占位符。
公共对象SelectedItem{get;set;}
//要在派生类中重写的占位符。
公共IReactiveList项{get;private set;}
}
XAML如下所示:

<DataTemplate DataType="{x:Type viewModels:SelectionBaseViewModel}">
    <StackPanel Orientation="Vertical">
        <Label Content="{Binding Label}" ContentStringFormat="{}{0}:" Margin="5,5,5,0"/>
        <ComboBox Margin="5,0,5,5" ItemsSource="{Binding Items, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" IsSynchronizedWithCurrentItem="True"
                  SelectedItem="{Binding SelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" BorderThickness="1" BorderBrush="White">
        </ComboBox>
    </StackPanel>
</DataTemplate>