私は次のようなことをするのに慣れています
State.Items.Add(new ListItem { Text = "SomeState", Value = NumericIDofState });
StateはASP.NETのリストボックスです。
WPF ComboBoxで同じことを実現するにはどうすればよいですか? ComboBoxItemオブジェクトに「Content」というプロパティがありますが、ユーザーに表示されるもの以外の値を各アイテムに割り当てるにはどうすればよいですか?助けてください。
コンボのこれらのプロパティを参照してください。
WPF Combobox には:
SelectedValuePath
プロパティは、SelectedValue
プロパティの値を決定するために使用されるプロパティへのパスを指定します。 ASP.NET ListItem
の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" />
SelectedValuePath
およびDisplayMemberPath
プロパティを、Key
によって表示されるオブジェクト(Value
およびCombobox
に対応する)の目的のプロパティ名に設定する場所。
または、コードビハインドで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>
Boolプロパティを使用した例:
<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>
Boolプロパティを使用した例:
<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"
値をスキップすると、実行時にComboBoxに新しいアイテムを追加するのは非常に簡単だと思います。
comboBox1.Items.Add("SomeText");
comboBox1.SelectedIndex = comboBox1.Items.Count - 1;
SelectedIndex
プロパティはItems.Count-1
に設定されているため、新しく追加されたアイテムは、選択されたアイテムとしてComboBoxに表示されます。