我习惯于像这样做事:
State.Items.Add(new ListItem { Text = "SomeState", Value = NumericIDofState });
在ASP.NET中,State是一个列表框。
如何在WPF ComboBox中实现相同的功能?我看到ComboBoxItem对象中有一个叫做“Content”的属性,但我该如何为每个项目分配一个除用户显示内容以外的值?请帮忙。
我习惯于像这样做事:
State.Items.Add(new ListItem { Text = "SomeState", Value = NumericIDofState });
在ASP.NET中,State是一个列表框。
如何在WPF ComboBox中实现相同的功能?我看到ComboBoxItem对象中有一个叫做“Content”的属性,但我该如何为每个项目分配一个除用户显示内容以外的值?请帮忙。
WPF Combobox具有以下特点:
SelectedValuePath
属性指定用于确定SelectedValue
属性值的属性路径。它类似于ASP.NETListItem
的Value
属性。DisplayMemberPath
属性定义默认模板,描述如何显示数据对象。它类似于ASP.NET ListItem
的Text
属性。假设你想要你的Combobox
显示以下KeyValuePair
对象的集合:
private static readonly KeyValuePair<int, string>[] tripLengthList = {
new KeyValuePair<int, string>(0, "0"),
new KeyValuePair<int, string>(30, "30"),
new KeyValuePair<int, string>(50, "50"),
new KeyValuePair<int, string>(100, "100"),
};
你可以在你的视图模型中定义一个返回该集合的属性:
你在视图模型中定义一个返回该集合的属性:
public KeyValuePair<int, string>[] TripLengthList
{
get
{
return tripLengthList;
}
}
那么,您的Combobox
的XAML将如下所示:
<ComboBox
SelectedValue="{Binding FilterService.TripLengthFrom, Mode=TwoWay}"
ItemsSource="{Binding TripLengthList, Mode=OneTime}"
SelectedValuePath="Key"
DisplayMemberPath="Value" />
在Combobox
中,您需要设置SelectedValuePath
和DisplayMemberPath
属性,以显示对象的所需属性名称(分别对应Key
和Value
)。
或者,如果您真的想要在代码后台中添加项目到Combobox
,而不是使用绑定,您也可以这样做。例如:
<!--XAML-->
<ComboBox x:Name="ComboBoxFrom"
SelectedValue="{Binding FilterService.TripLengthFrom, Mode=TwoWay}" />
// Code behind
public partial class FilterView : UserControl
{
public FilterView()
{
this.InitializeComponent();
this.ComboBoxFrom.SelectedValuePath = "Key";
this.ComboBoxFrom.DisplayMemberPath = "Value";
this.ComboBoxFrom.Items.Add(new KeyValuePair<int, string>(0, "0"));
this.ComboBoxFrom.Items.Add(new KeyValuePair<int, string>(30, "30"));
this.ComboBoxFrom.Items.Add(new KeyValuePair<int, string>(50, "50"));
this.ComboBoxFrom.Items.Add(new KeyValuePair<int, string>(100, "100"));
}
如果你只想在视图模型中公开一个简单的属性并处理视图中选择项的文本,你可以使用以下简单的解决方案:
<ComboBox SelectedValuePath="Tag" SelectedValue="{Binding YourIntProperty, Mode=TwoWay}">
<ComboBoxItem Content="First choice" Tag="0"/>
<ComboBoxItem Content="Second choice" Tag="1"/>
<ComboBoxItem Content="Third choice" Tag="2"/>
</ComboBox>
具有布尔属性的示例:
<ComboBox SelectedValuePath="Tag" SelectedValue="{Binding IsActive, Mode=TwoWay}">
<ComboBoxItem Content="No" Tag="False"/>
<ComboBoxItem Content="Yes" Tag="True"/>
</ComboBox>
使用具体类型的替代选项(原始示例)
下面是更详细的替代选项,其中类型被明确声明。根据您的喜好风格(或者某些需要它的类型),也许它更适合您。
<ComboBox SelectedValuePath="Tag" SelectedValue="{Binding YourIntProperty, Mode=TwoWay}">
<ComboBoxItem Content="First choice">
<ComboBoxItem.Tag>
<sys:Int32>0</sys:Int32>
</ComboBoxItem.Tag>
</ComboBoxItem>
<ComboBoxItem Content="Second choice">
<ComboBoxItem.Tag>
<sys:Int32>1</sys:Int32>
</ComboBoxItem.Tag>
</ComboBoxItem>
<ComboBoxItem Content="Third choice">
<ComboBoxItem.Tag>
<sys:Int32>2</sys:Int32>
</ComboBoxItem.Tag>
</ComboBoxItem>
</ComboBox>
布尔属性的示例:
<ComboBox SelectedValuePath="Tag" SelectedValue="{Binding IsActive, Mode=TwoWay}">
<ComboBoxItem Content="No">
<ComboBoxItem.Tag>
<sys:Boolean>False</sys:Boolean>
</ComboBoxItem.Tag>
</ComboBoxItem>
<ComboBoxItem Content="Yes">
<ComboBoxItem.Tag>
<sys:Boolean>True</sys:Boolean>
</ComboBoxItem.Tag>
</ComboBoxItem>
</ComboBox>
sys命名空间的声明如下:
xmlns:sys="clr-namespace:System;assembly=mscorlib"
了解combo的这些属性:
comboBox1.Items.Add("SomeText");
comboBox1.SelectedIndex = comboBox1.Items.Count - 1;
将SelectedIndex
属性设置为Items.Count-1
,以便新添加的项目显示为ComboBox中的选定项目。