来自字符串的 WPF ComboBox 初始状态 属性

WPF ComboBox initial state from a string property

我有一个简单的组合:

     <ComboBox x:Name="testCombo" SelectedValue="{Binding State, Mode=TwoWay}" VerticalAlignment="Center" HorizontalAlignment="Center" MinWidth="100">
        <ComboBoxItem>OPEN</ComboBoxItem>
        <ComboBoxItem>CLOSED</ComboBoxItem>
    </ComboBox>

该状态只是一个实施了 INotifyPropertyChanged 的​​字符串 属性。

    private string state;

    public string State
    {
        get { return state; }
        set
        {
            state = value;
            OnPropertyChanged("State");
        }
    }

我想要实现的是,当状态字符串 属性 最初设置为 "OPEN" 时,当我的 window 加载时,组合框将其初始项设置为 "OPEN"。

我也尝试在那里附加一个转换器:

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        ComboBoxItem cbi = new ComboBoxItem();

        cbi.Content = value as string;

        return cbi;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (value as ComboBoxItem).Content;
    }

有了这个,我的状态字符串 属性 将被很好地填充,但 ComboBox 不会达到所需的初始状态。

ComboBoxItem 不是按内容比较,而是按引用进行比较,您在转换器中创建的实例与 ComboBox 中显示的实例不同,因此它们永远不会相等。您可以做的是将 ItemsSource 设置为字符串列表,然后将 SelectedItem 直接绑定到字符串 属性 而无需任何转换器

<ComboBox SelectedItem="{Binding State, Mode=TwoWay}" x:Name="testCombo">
    <ComboBox.ItemsSource>
        <x:Array Type="{x:Type sys:String}">
            <sys:String>OPEN</sys:String>
            <sys:String>CLOSED</sys:String>
        </x:Array>
    </ComboBox.ItemsSource>
</ComboBox>

您还需要将 sys 命名空间添加到您的 XAML

xmlns:sys="clr-namespace:System;assembly=mscorlib"