以下の違いは何ですか?
これらすべての依存関係プロパティは Selector クラスで定義されています。私はよくSelectedItem
をSelectedValue
と、そしてSelectedValue
をSelectedValuePath
と混同します。
私はそれらの違いを知りたいのですが、またいつ使うのか、特にSelectedValue
とSelectedValuePath
を知りたいです。簡単な例を使って、の使い方を説明してください。
それらの名前は少し混乱するかもしれません:)。概要は次のとおりです。
SelectedItemプロパティは、リストがバインドされているオブジェクト全体を返します。リストをCategory
name__オブジェクトのコレクションにバインドしたとしましょう(各CategoryオブジェクトはNameプロパティとIDプロパティを持ちます)。例えば。 ObservableCollection<Category>
。 SelectedItem
name__プロパティは、現在選択されているCategory
name__オブジェクトを返します。ただし、バインドの目的でこれを使用するのは必ずしも望ましいことではありません。これは、Categoryオブジェクト全体を、そのCategoryオブジェクトの単一のプロパティの値(ID
name__など)ではなく、リストのバインド先のプロパティにのみバインドできるためです。プロパティ)。
そのため、代替手段としてSelectedValuePathプロパティとSelectedValueプロパティがあります。結合の(あなたは互いに組み合わせてそれらを使用します)。ビューがバインドされているProduct
name__オブジェクトがあるとしましょう(ProductName、Weightなどのプロパティが含まれています)。また、そのProductオブジェクトにCategoryID
name__プロパティがあり、ユーザーがカテゴリのリストからその商品のカテゴリを選択できるようにしたいとします。 ProductオブジェクトのCategoryID
name__プロパティに割り当てるには、CategoryオブジェクトのIDプロパティが必要です。 SelectedValuePath
name__およびSelectedValue
name__プロパティが入ってくる場所です。CategoryオブジェクトのIDプロパティを、SelectedValuePath='ID'
を使用してリストがバインドされているProductオブジェクトのプロパティに割り当て、次にSelectedValue
name__プロパティをプロパティにバインドするように指定します。 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" />
最初は少し混乱しますが、うまくいけば少しわかりやすくなります... :)
クリス
もう少し概念的に答えるには:
SelectedValuePath
は、ListBoxのItemsSource
にバインドされたオブジェクトのどのプロパティを(その名前で)項目のSelectedValue
として使用するかを定義します。
たとえば、ListBoxがPerson
、Name
、Age
の各プロパティを持つGender
オブジェクトのコレクションにバインドされている場合、SelectedValuePath=Name
は選択されたPerson
のName
プロパティの値をSelectedValue
に返します。
どのプロパティを表示するかを指定するListBoxのControlTemplateをオーバーライドする(またはStyleを適用する)場合、SelectedValuePath
は使用できません。
一方、SelectedItem
は、現在選択されているPerson
オブジェクト全体を返します。
(これは MSDNの他の例 で、TreeViewを使用しています)
更新:@Joeが指摘したように、DisplayMemberPathプロパティはSelected *プロパティとは無関係です。その正しい説明は次のとおりです。
これらの値はDisplayMemberPath
(SelectorではなくItemsControlで定義される)とは異なりますが、そのプロパティはSelectedValuePath
と同様の動作をします。スタイル/テンプレートがない場合は、itemにバインドされたオブジェクトのどのプロパティを使用するかを識別します。その文字列表現として。
SelectedItem
はobject
です。 SelectedValue
とSelectedValuePath
はstring
です。
例えば、ListBoxを使うと:
あなたが私にlistbox1.SelectedValue
と言ったら、それは現在選択されているアイテムのテキストを返します。
string value = listbox1.SelectedValue;
あなたが私にlistbox1.SelectedItem
を与えると言うなら、それはあなたにオブジェクト全体を与えるでしょう。
ListItem item = listbox1.SelectedItem;
string value = item.value;
この質問に触発された私はここで コードスニペットと共にブログを書きました 。下記はブログからの抜粋です。
SelectedItem - Selected Itemは、表示されるDataSourceから実際の値をバインドするのに役立ちます。これはオブジェクト型で、オブジェクト型から派生した任意の型をこのプロパティでバインドできます。この場合、コンボボックスにMVVMバインディングを使用するので、これはVM項目が選択されたことを通知するために使用できるプロパティです。
SelectedValueおよびSelectedValuePath - これらは、コンボボックスで最も混乱しやすく誤解される2つのプロパティです。しかし、これらのプロパティは、コンボボックスをすでに作成されているオブジェクトの値とバインドするときに役立ちます。プロパティについての簡単なアイデアを得るために次のリストの私の最後のシナリオをチェックしてください。
コレクションを使用してデータを格納するすべてのコントロールには、SelectedValue、SelectedItemプロパティがあります。これらのコントロールの例は、ListBox、Dropdown、RadioButtonList、CheckBoxListです。
あなたが文字通り選択されたアイテムのテキストを検索したいならもっと具体的になるためにあなたは書くことができます:
ListBox1.SelectedItem.Text;
値がそれ以前に設定されている場合、ListBox1はSelectedValueプロパティを使用してTextを返すこともできます。しかし、上記はテキストを取得するためのより効果的な方法です。
現在、値はユーザーには見えないものですが、主にデータベースに格納するために使用されます。 ListBox1のTextは挿入しませんが、挿入することもできますが、以前は選択した項目の値を挿入していました。私達が使用できる価値を得るために
ListBox1.SelectedValue