gpt4 book ai didi

c# - WPF ComboboxItem 绑定(bind)

转载 作者:太空宇宙 更新时间:2023-11-03 13:10:03 26 4
gpt4 key购买 nike

我想学习 WPF 编程。我想知道将员工的性别绑定(bind)到 ComboBox:

class Staff {
public int Gender {get; set;}
}

class ViewModel {
private Staff _staff
public Staff Staff {
get {return _staff;}
set {
_staff = value;
RaisePropertyChangedEvent("Staff");
}
}
}

<ComboBox SelectedItem="{Binding Staff.Gender, Converter={StaticResource GenderConverter}}">
<ComboBoxItem IsSelected="True" Content="{StaticResource strGenderMale}"/>
<ComboBoxItem Content="{StaticResource strGenderFemale}"/>
<ComboBoxItem Content="{StaticResource strGenderOther}"/>
</ComboBox>

GenderConverter 是我定制的 Converter 来转换 int <-> string (0: male, 1: female, 2: other)

public class IntegerToGenderConverter : IValueConverter {
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
if (value is int) {
if ((int)value == MyConstants.GENDER_MALE) { //GENDER_MALE is 1
return MyConstants.GENDER_MALE_STR; //GENDER_MALE_STR is the string: "Male"
}
if ((int)value == MyConstants.GENDER_FEMALE) {
return MyConstants.GENDER_FEMALE_STR;
}
}
return MyConstants.GENDER_OTHER_STR;
}

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
switch (value.ToString()) {
case MyConstants.GENDER_MALE_STR:
return MyConstants.GENDER_MALE;
case MyConstants.GENDER_FEMALE_STR:
return MyConstants.GENDER_FEMALE;
default:
return MyConstants.GENDER_OTHER;
}
}
}

当我运行应用程序时,员工不为空(除性别外,其他所有内容(如姓名、出生日期...)都绑定(bind)良好:(

编辑:

当我创建一个 List Genders 并将其绑定(bind)到 ComboBox 的属性 ItemsSource 而不是使用标签时,它运行良好。为什么???

最佳答案

ComboBox 使用 ComboBoxItem 作为项目类型,当您显式添加它们时

<ComboBox>
<ComboBoxItem Content="..."/>
...
</ComboBox>

这意味着 SelectedItem 属性返回一个 ComboBoxItem,然后将其传递给您的转换器。但是,您的转换器不期望 ComboBoxItem 类型的值。

当您添加整数时 - 如在绑定(bind)的性别列表中 - 项目类型为 int,您已在转换器中成功处理了它。在这种情况下,ComboBox 类仅在内部创建和使用 ComboBoxItems。

这是从 ItemSource 派生的所有 WPF 控件中的常见行为。他们使用用户提供的项目类型。


也就是说,您通常会为 Gender 属性使用枚举类型:

public enum Gender
{
Male, Female, Other
}

public class Staff
{
public Gender Gender { get; set; }
}

然后您可以将 Gender 值添加到您的 ComboBox 并在没有转换器的情况下绑定(bind) SelectedItem:

<ComboBox SelectedItem="{Binding Staff.Gender}">
<local:Gender>Male</local:Gender>
<local:Gender>Female</local:Gender>
<local:Gender>Other</local:Gender>
</ComboBox>

其中 local 是包含 Gender 类型的 C# 命名空间的 XAML 命名空间声明。

关于c# - WPF ComboboxItem 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29313382/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com