web-dev-qa-db-ja.com

SelectedItem、SelectedValue、およびSelectedValuePathの違い

以下の違いは何ですか?

これらすべての依存関係プロパティは Selector クラスで定義されています。私はよくSelectedItemSelectedValueと、そしてSelectedValueSelectedValuePathと混同します。

私はそれらの違いを知りたいのですが、またいつ使うのか、特にSelectedValueSelectedValuePathを知りたいです。簡単な例を使って、の使い方を説明してください。

320
Nawaz

それらの名前は少し混乱するかもしれません:)。概要は次のとおりです。

  • SelectedItemプロパティは、リストがバインドされているオブジェクト全体を返します。リストをCategoryname__オブジェクトのコレクションにバインドしたとしましょう(各CategoryオブジェクトはNameプロパティとIDプロパティを持ちます)。例えば。 ObservableCollection<Category>SelectedItemname__プロパティは、現在選択されているCategoryname__オブジェクトを返します。ただし、バインドの目的でこれを使用するのは必ずしも望ましいことではありません。これは、Categoryオブジェクト全体を、そのCategoryオブジェクトの単一のプロパティの値(IDname__など)ではなく、リストのバインド先のプロパティにのみバインドできるためです。プロパティ)。

  • そのため、代替手段としてSelectedValuePathプロパティとSelectedValueプロパティがあります。結合の(あなたは互いに組み合わせてそれらを使用します)。ビューがバインドされているProductname__オブジェクトがあるとしましょう(ProductName、Weightなどのプロパティが含まれています)。また、そのProductオブジェクトにCategoryIDname__プロパティがあり、ユーザーがカテゴリのリストからその商品のカテゴリを選択できるようにしたいとします。 ProductオブジェクトのCategoryIDname__プロパティに割り当てるには、CategoryオブジェクトのIDプロパティが必要です。 SelectedValuePathname__およびSelectedValuename__プロパティが入ってくる場所です。CategoryオブジェクトのIDプロパティを、SelectedValuePath='ID'を使用してリストがバインドされているProductオブジェクトのプロパティに割り当て、次にSelectedValuename__プロパティをプロパティにバインドするように指定します。 DataContext(すなわち製品)について.

以下の例はこれを示しています。 (ItemsSourceを介して)カテゴリのリストにバインドされたComboBoxがあります。選択した値として(SelectedValueプロパティを使用して)ProductのCategoryIDプロパティをバインドしています。これをSelectedValuePathプロパティを介してCategoryのIDプロパティに関連付けます。そして、DisplayMemberPathプロパティを使用して、ComboBoxのNameプロパティのみを表示するということです。

<ComboBox ItemsSource="{Binding Categories}" 
          SelectedValue="{Binding CategoryID, Mode=TwoWay}" 
          SelectedValuePath="ID" 
          DisplayMemberPath="Name" />

最初は少し混乱しますが、うまくいけば少しわかりやすくなります... :)

クリス

505
Chris Anderson

もう少し概念的に答えるには:

SelectedValuePath は、ListBoxのItemsSourceにバインドされたオブジェクトのどのプロパティを(その名前で)項目のSelectedValueとして使用するかを定義します。

たとえば、ListBoxがPersonNameAgeの各プロパティを持つGenderオブジェクトのコレクションにバインドされている場合、SelectedValuePath=Nameは選択されたPersonNameプロパティの値をSelectedValueに返します。

どのプロパティを表示するかを指定するListBoxのControlTemplateをオーバーライドする(またはStyleを適用する)場合、SelectedValuePathは使用できません。

一方、SelectedItemは、現在選択されているPersonオブジェクト全体を返します。

(これは MSDNの他の例 で、TreeViewを使用しています)

更新:@Joeが指摘したように、DisplayMemberPathプロパティはSelected *プロパティとは無関係です。その正しい説明は次のとおりです。

これらの値はDisplayMemberPath(SelectorではなくItemsControlで定義される)とは異なりますが、そのプロパティはSelectedValuePathと同様の動作をします。スタイル/テンプレートがない場合は、itemにバインドされたオブジェクトのどのプロパティを使用するかを識別します。その文字列表現として。

64
Dan J

SelectedItemobjectです。 SelectedValueSelectedValuePathstringです。

例えば、ListBoxを使うと:

あなたが私にlistbox1.SelectedValueと言ったら、それは現在選択されているアイテムのテキストを返します。

string value = listbox1.SelectedValue;

あなたが私にlistbox1.SelectedItemを与えると言うなら、それはあなたにオブジェクト全体を与えるでしょう。

ListItem item = listbox1.SelectedItem;
string value = item.value;
8
capdragon

この質問に触発された私はここで コードスニペットと共にブログを書きました 。下記はブログからの抜粋です。

SelectedItem - Selected Itemは、表示されるDataSourceから実際の値をバインドするのに役立ちます。これはオブジェクト型で、オブジェクト型から派生した任意の型をこのプロパティでバインドできます。この場合、コンボボックスにMVVMバインディングを使用するので、これはVM項目が選択されたことを通知するために使用できるプロパティです。

SelectedValueおよびSelectedValuePath - これらは、コンボボックスで最も混乱しやすく誤解される2つのプロパティです。しかし、これらのプロパティは、コンボボックスをすでに作成されているオブジェクトの値とバインドするときに役立ちます。プロパティについての簡単なアイデアを得るために次のリストの私の最後のシナリオをチェックしてください。

5
Vikram

コレクションを使用してデータを格納するすべてのコントロールには、SelectedValue、SelectedItemプロパティがあります。これらのコントロールの例は、ListBox、Dropdown、RadioButtonList、CheckBoxListです。

あなたが文字通り選択されたアイテムのテキストを検索したいならもっと具体的になるためにあなたは書くことができます:

ListBox1.SelectedItem.Text;

値がそれ以前に設定されている場合、ListBox1はSelectedValueプロパティを使用してTextを返すこともできます。しかし、上記はテキストを取得するためのより効果的な方法です。

現在、値はユーザーには見えないものですが、主にデータベースに格納するために使用されます。 ListBox1のTextは挿入しませんが、挿入することもできますが、以前は選択した項目の値を挿入していました。私達が使用できる価値を得るために

ListBox1.SelectedValue

出典

1
kamalpreet