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