web-dev-qa-db-ja.com

WPFコンボボックス値と表示テキスト

私は次のようなことをするのに慣れています

State.Items.Add(new ListItem { Text = "SomeState", Value = NumericIDofState });

StateはASP.NETのリストボックスです。

WPF ComboBoxで同じことを実現するにはどうすればよいですか? ComboBoxItemオブジェクトに「Content」というプロパティがありますが、ユーザーに表示されるもの以外の値を各アイテムに割り当てるにはどうすればよいですか?助けてください。

21
Prabath Yapa

コンボのこれらのプロパティを参照してください。

21
TalentTuner

WPF Combobox には:

  • SelectedValuePath プロパティは、SelectedValueプロパティの値を決定するために使用されるプロパティへのパスを指定します。 ASP.NET ListItemValueプロパティに似ています。
  • DisplayMemberPath プロパティは、データオブジェクトの表示方法を説明するデフォルトテンプレートを定義します。 ASP.NET ListItemTextプロパティに似ています。

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"));
    }
33

ビューモデルで単純なプロパティを公開し、ビューで選択項目のテキストを処理するだけの場合、次のような簡単な解決策を実行できます。

    <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"
27
TGasdf

値をスキップすると、実行時にComboBoxに新しいアイテムを追加するのは非常に簡単だと思います。

comboBox1.Items.Add("SomeText");

comboBox1.SelectedIndex = comboBox1.Items.Count - 1;

SelectedIndexプロパティはItems.Count-1に設定されているため、新しく追加されたアイテムは、選択されたアイテムとしてComboBoxに表示されます。

1
Mamta D