ComboBox最初不选择绑定值

Dan*_*ode 2 c# xaml combobox win-universal-app uwp

首先,不是重复的。

TextBox和CheckBox可以正常工作,而不是ComboBox。

模型

internal class Word : _Model
{
    public enum Categories
    {
        Noun,
        Verb,
    }

    private Categories category;
    public Categories Category
    {
        get
        {
            return this.category;
        }
        set
        {
            this.SetProperty(ref this.category,
                             value);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

通知(可以跳过此部分,可以安全阅读)

internal abstract class _Model : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
    {
        if (object.Equals(storage, value))
        {
            return false;
        }
        storage = value;
        this.OnPropertyChanged(propertyName);
        return true;
    }

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        var eventHandler = this.PropertyChanged;
        if (eventHandler != null)
        {
            eventHandler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

控制(型号)

public sealed partial class WordEditor : UserControl
{
    public WordEditor()
    {
        this.Model = new Models.Word();
        this.Model.Category = Models.Word.Categories.Verb;
        this.InitializeComponent();
    }

    private Models.Word Model { get; set; }

    internal IList<KeyValuePair<Models.Word.Categories, string>> Categories { get { return new List<KeyValuePair<Models.Word.Categories, string>>() { new KeyValuePair<Models.Word.Categories, string>(Models.Word.Categories.Noun, "Noun"), new KeyValuePair<Models.Word.Categories, string>(Models.Word.Categories.Verb, "Verb") }; } }
}
Run Code Online (Sandbox Code Playgroud)

捆绑

<UserControl.Resources>
    <converters:AnyConverter x:Key="AnyConverter"/>
</UserControl.Resources>

<StackPanel>
    <ComboBox ItemsSource="{x:Bind Path=Categories, Mode=OneTime}"
              DisplayMemberPath="Value"
              SelectedValuePath="Key"
              SelectedValue="{x:Bind Path=Model.Category, Mode=TwoWay, Converter={StaticResource ResourceKey=AnyConverter}}"/>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)

转换器

internal class AnyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        return value;
    }
}
Run Code Online (Sandbox Code Playgroud)

问题

ComboBox的“动词”和“名词”正确显示,并且模型正确反映了“动词”或“名词”的选择。

但是,即使“类别”最初设置为“动词”,ComboBox也不会显示该信息。

如何解决它,使ComboBox首次出现时选择“动词”?

Jay*_*Zuo 5

我转载了您的问题。这里的问题ComboBox.SelectedValue不适用于枚举类型。为了测试这一点,我们可以使用一个ComboBox不带绑定的SelectedValue代码,并将in-behind 设置为如下所示:

<ComboBox x:Name="cmb" DisplayMemberPath="Value" SelectedValuePath="Key" />

cmb.ItemsSource = Categories;
cmb.SelectedValue = Models.Word.Categories.Verb;
Run Code Online (Sandbox Code Playgroud)

虽然我已经设置Models.Word.Categories.VerbSelectedValue,但是它的价值仍然是null在此处输入图片说明

但是,当Value类型为int或时,它可以工作string。根据我在WPF中的经验,枚举类型也应该起作用。我认为这可能是UWP中的错误。

作为一种解决方法,我认为您可以使用SelectedIndexSelectedItem属性在ComboBox首次出现时选择“动词”。例如:

在XAML中,使用SelectedIndex代替SelectedValue

<ComboBox DisplayMemberPath="Value"
          ItemsSource="{x:Bind Path=Categories, Mode=OneTime}"
          SelectedIndex="{x:Bind Path=Model.Category, Mode=TwoWay, Converter={StaticResource ResourceKey=AnyConverter}}"
          SelectedValuePath="Key" />
Run Code Online (Sandbox Code Playgroud)

并更改Converter如下:

internal class AnyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        return (int)(Models.Word.Categories)value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        return (Models.Word.Categories)(int)value;
    }
}
Run Code Online (Sandbox Code Playgroud)

此后,设置this.Model.Category = Models.Word.Categories.Verb;将起作用。

  • 是的,“枚举”可以在“ int”中离散。但是默认情况下,第一个枚举数的值为0,并且每个后续枚举数的值都会增加1。如果您坚持将它们设为离散值,则可以尝试使用Array.IndexOf(Enum.GetValues(typeof(Models.Word .Categories),(Models.Word.Categories)value)`来获取`Convert`和`(Models.Word.Categories)Enum.GetValues(typeof(Models.Word.Categories))。GetValue((int )value)在`ConvertBack`中。 (2认同)