绑定到IEnumerable的Enum值时,WPF ComboBox验证错误

时间:2016-05-27 18:05:52

标签: c# wpf xaml combobox enums

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

  

价值''无法转换。

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

代码详细信息...我有一个实现IAcquire<T>的服务,它返回枚举值的可枚举:

public interface IAcquire<T>
{
    IReactiveList<T> Items { 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; }
}

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>

0 个答案:

没有答案