C# 手动设置组合框项目时,如何使用mvvm中的绑定在wpf中设置组合框默认值

C# 手动设置组合框项目时,如何使用mvvm中的绑定在wpf中设置组合框默认值,c#,wpf,mvvm,combobox,C#,Wpf,Mvvm,Combobox,我正在wpf中使用mvvm。我正在设置表单以更新用户数据。我有一个组合框来选择用户的性别。我已经在源代码中手动添加了组合框项。加载数据以形成所有字段时,其他字段显示正确。但是combobox没有显示任何内容。我使用了双向绑定,我从表单中选择的值在viewModel中得到。我搜索了几个小时,发现了许多类似的问题,但没有任何效果。我在下面插入我的代码段。请给我一个解决办法 <ComboBox Grid.Column="2" SelectedItem="{Binding Se

我正在wpf中使用mvvm。我正在设置表单以更新用户数据。我有一个组合框来选择用户的性别。我已经在源代码中手动添加了组合框项。加载数据以形成所有字段时,其他字段显示正确。但是combobox没有显示任何内容。我使用了双向绑定,我从表单中选择的值在viewModel中得到。我搜索了几个小时,发现了许多类似的问题,但没有任何效果。我在下面插入我的代码段。请给我一个解决办法

<ComboBox 
    Grid.Column="2" 
    SelectedItem="{Binding SelectedEmployees.gender, Mode=TwoWay}" 
    SelectedValue="{Binding SelectedEmployees.gender, Mode=TwoWay}"
    >
    <ComboBoxItem Content="Male"/>
    <ComboBoxItem Content="Female"/>
</ComboBox> 

我怀疑SelectedEmployees.gender不是comboboxitem类型。 直接在combobox中创建comboboxitems的快捷方式是一个错误的举动

当我这样做时:

    xmlns:sys="clr-namespace:System;assembly=mscorlib">
<Window.DataContext>
    <local:MainWIndowViewModel/>
</Window.DataContext>
<Window.Resources>
    <x:Array Type="sys:String" x:Key="Genders">
        <sys:String>Male</sys:String>
        <sys:String>Female</sys:String>
    </x:Array>
</Window.Resources>
<Grid>
    <ComboBox 
     SelectedItem="{Binding gender, Mode=TwoWay}" 
        ItemsSource="{StaticResource Genders}"
        />
</Grid>
我得到了一个字符串,而不是我绑定的comboboxitem。
你可能更想要这样的东西。

我怀疑SelectedEmployees.gender不是comboboxitem类型。 直接在combobox中创建comboboxitems的快捷方式是一个错误的举动

当我这样做时:

    xmlns:sys="clr-namespace:System;assembly=mscorlib">
<Window.DataContext>
    <local:MainWIndowViewModel/>
</Window.DataContext>
<Window.Resources>
    <x:Array Type="sys:String" x:Key="Genders">
        <sys:String>Male</sys:String>
        <sys:String>Female</sys:String>
    </x:Array>
</Window.Resources>
<Grid>
    <ComboBox 
     SelectedItem="{Binding gender, Mode=TwoWay}" 
        ItemsSource="{StaticResource Genders}"
        />
</Grid>
我得到了一个字符串,而不是我绑定的comboboxitem。
您可能更想要这样的东西。

这可能是最好的方法,特别是如果您想学习MVVM:使用枚举类型表示性别。LOL从来都不是一个有效的性别,所以不要让任何人尝试使用它。通过将组合框绑定到静态集合来填充组合框。将SelectedEmployees.gender初始化为您希望作为默认值的值,其余的由绑定处理

<ComboBox 
    SelectedItem="{Binding SelectedEmployees.gender}" 
    ItemsSource="{Binding SelectedEmployees.Genders}"
    /> 
SelectedEmployees类是否实现INotifyPropertyChanged,SelectedEmployees.gender是否在其值更改时引发PropertyChanged

摆脱模式=绑定上的双向模式;您不需要明确地这样做。这是您在ComboBox.SelectedValue或ComboBox.SelectedItem上放置的任何绑定的默认值

正如Andy在评论中指出的,您的SelectedValue和SelectedItem都将成为ComboBoxItem的实例,因为这就是您填充ComboBox的方式。您想要的字符串位于ComboBoxItems的Content属性中,因此请使用SelectedValuePath告知ComboBox,并绑定到SelectedValue属性。SelectedItem将是ComboBoxItem本身,这对您来说是无用的

<ComboBox 
    SelectedValue="{Binding SelectedEmployees.gender}" 
    SelectedValuePath="Content"
    >
    <ComboBoxItem Content="Male" />
    <ComboBoxItem Content="Female" />
</ComboBox>
还有另一种方法:用字符串填充组合框

<ComboBox 
    SelectedItem="{Binding SelectedEmployees.gender}" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    >
    <sys:String>Male</sys:String>
    <sys:String>Female</sys:String>
</ComboBox> 

有关Andy ItemSource的另一种填充方式,请参见Andy ItemSource的组合框

这可能是最好的方法,特别是如果你想学习MVVM:使用枚举类型表示性别。LOL从来都不是一个有效的性别,所以不要让任何人尝试使用它。通过将组合框绑定到静态集合来填充组合框。将SelectedEmployees.gender初始化为您希望作为默认值的值,其余的由绑定处理

<ComboBox 
    SelectedItem="{Binding SelectedEmployees.gender}" 
    ItemsSource="{Binding SelectedEmployees.Genders}"
    /> 
SelectedEmployees类是否实现INotifyPropertyChanged,SelectedEmployees.gender是否在其值更改时引发PropertyChanged

摆脱模式=绑定上的双向模式;您不需要明确地这样做。这是您在ComboBox.SelectedValue或ComboBox.SelectedItem上放置的任何绑定的默认值

正如Andy在评论中指出的,您的SelectedValue和SelectedItem都将成为ComboBoxItem的实例,因为这就是您填充ComboBox的方式。您想要的字符串位于ComboBoxItems的Content属性中,因此请使用SelectedValuePath告知ComboBox,并绑定到SelectedValue属性。SelectedItem将是ComboBoxItem本身,这对您来说是无用的

<ComboBox 
    SelectedValue="{Binding SelectedEmployees.gender}" 
    SelectedValuePath="Content"
    >
    <ComboBoxItem Content="Male" />
    <ComboBoxItem Content="Female" />
</ComboBox>
还有另一种方法:用字符串填充组合框

<ComboBox 
    SelectedItem="{Binding SelectedEmployees.gender}" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    >
    <sys:String>Male</sys:String>
    <sys:String>Female</sys:String>
</ComboBox> 

请参阅Andy的答案,了解通过ItemsSource用字符串填充组合框的另一种方法

你能发布你的视图模型代码,特别是绑定成员吗?性别的数据类型是什么?项目是comboboxitems。我想知道什么样的对象最终会成为selecteditem。@Andy应该是stringNope。这是一个comboboxitem。这可能是他的问题。或者他们中的一个。因此我的问题是。你能发布你的视图模型代码吗,特别是绑定成员?性别的数据类型是什么?项目是comboboxitems。我想知道什么样的对象最终会成为selecteditem。@Andy应该是stringNope。这是一个comboboxitem。这可能是他的问题。或者他们中的一个。因此我的问题是,因为OP提到使用mvvvm,我认为最后一种方法是最合适的。对一个不太完整的问题给出了一个非常完整的答案:因为OP提到使用mvvvm,我认为最后一种方法是最合适的。对于一个不太完整的问题,我得到了一个非常完整的答案:谢谢@Andy。我做了这些改动,效果很好。谢谢@Andy。我做了这些改变,效果很好。