次の違いは何ですか?
これらの依存関係プロパティはすべて、Selectorクラスで定義されています。私はよく、、およびと混同SelectedItemします。SelectedValueSelectedValueSelectedValuePath
SelectedValueそれらの違いと、いつ使用するのか、特にとを知りたいのですがSelectedValuePath。いくつかの簡単な例でそれらの使用法を説明してください。
次の違いは何ですか?
これらの依存関係プロパティはすべて、Selectorクラスで定義されています。私はよく、、およびと混同SelectedItemします。SelectedValueSelectedValueSelectedValuePath
SelectedValueそれらの違いと、いつ使用するのか、特にとを知りたいのですがSelectedValuePath。いくつかの簡単な例でそれらの使用法を説明してください。
それらの名前は少し紛らわしいかもしれません:)。要約は次のとおりです。
SelectedItemプロパティは、リストがバインドされているオブジェクト全体を返します。つまり、リストをCategoryオブジェクトのコレクションにバインドしたとします(各CategoryオブジェクトにはNameプロパティとIDプロパティがあります)。例えば。ObservableCollection<Category>。プロパティはSelectedItem、現在選択されているCategoryオブジェクトを返します。ただし、バインドの目的では、これは必ずしも必要なものではありません。これにより、Categoryオブジェクト全体を、そのCategoryオブジェクトの単一のプロパティ(そのIDプロパティなど)の値ではなく、リストがバインドされているプロパティにバインドできるようになるためです。 )。
したがって、バインドの代替手段として、SelectedValuePathプロパティとSelectedValueプロパティがあります(これらを相互に組み合わせて使用します)。ビューがバインドされているProductオブジェクトがあるとします(ProductName、Weightなどのプロパティを使用)。またCategoryID、そのProductオブジェクトにプロパティがあり、ユーザーがカテゴリのリストから製品のカテゴリを選択できるようにしたいとします。カテゴリオブジェクトのIDプロパティをCategoryIDProductオブジェクトのプロパティに割り当てる必要があります。これはSelectedValuePath、SelectedValueプロパティが入ります。CategoryオブジェクトのIDプロパティを、リストがバインドされているProductオブジェクトのプロパティに割り当てる必要があることを指定してから、プロパティをDataContextのプロパティ(つまり、Product)SelectedValuePath='ID'にバインドしSelectedValueます。
以下の例はこれを示しています。(ItemsSourceを介して)カテゴリのリストにバインドされたComboBoxがあります。ProductのCategoryIDプロパティを選択された値としてバインドしています(SelectedValueプロパティを使用)。これは、SelectedValuePathプロパティを介してカテゴリのIDプロパティに関連付けられています。そして、ComboBoxにNameプロパティのみを表示し、DisplayMemberPathプロパティを使用すると言っています)。
<ComboBox ItemsSource="{Binding Categories}"
SelectedValue="{Binding CategoryID, Mode=TwoWay}"
SelectedValuePath="ID"
DisplayMemberPath="Name" />
public class Category
{
public int ID { get; set; }
public string Name { get; set; }
}
public class Product
{
public int CategoryID { get; set; }
}
最初は少し混乱しますが、うまくいけば、これで少しわかりやすくなります... :)
クリス
もう少し概念的に答えるには:
SelectedValuePathListBoxにバインドされたオブジェクトのどのプロパティを(その名前で)ItemsSourceアイテムとして使用するかを定義しますSelectedValue。
たとえば、ListBoxがPersonオブジェクトのコレクションにバインドされている場合、各オブジェクトにはName、、、AgeおよびGenderプロパティがあり、選択したプロパティのSelectedValuePath=Name値がに返されます。PersonNameSelectedValue
表示するプロパティを指定するListBoxのControlTemplateをオーバーライドする(またはスタイルを適用する)と、SelectedValuePath使用できないことに注意してください。
SelectedItemPerson一方、現在選択されているオブジェクト全体を返します。
(これは、TreeViewを使用したMSDNからのさらなる例です)
更新: @Joeが指摘したように、DisplayMemberPathプロパティはSelected*プロパティとは無関係です。その適切な説明は次のとおりです。
これらの値はDisplayMemberPath(SelectorではなくItemsControlで定義されている)とは異なりますが、そのプロパティは次のように動作することに注意してくださいSelectedValuePath:スタイル/テンプレートがない場合、itemにバインドされたオブジェクトのどのプロパティを文字列表現。
SelectedItemですobject。
SelectedValueとSelectedValuePathはstringsです。
たとえば、ListBoxを使用します。
あなたが私listbox1.SelectedValueに与えると言うならば、それは現在選択されているアイテムのテキストを返します。
string value = listbox1.SelectedValue;
あなたが私listbox1.SelectedItemに与えると言うなら、それはあなたに全体のオブジェクトを与えるでしょう。
ListItem item = listbox1.SelectedItem;
string value = item.value;
この質問に触発されて、私はここにコードスニペットと一緒にブログを書きました。以下はブログからの抜粋です
SelectedItem –選択されたアイテムは、表示されるデータソースからの実際の値をバインドするのに役立ちます。これはオブジェクト型であり、オブジェクト型から派生した任意の型をこのプロパティでバインドできます。この場合、コンボボックスにMVVMバインディングを使用するため、これは、アイテムが選択されたことをVMに通知するために使用できるプロパティです。
SelectedValueとSelectedValuePath–これらはコンボボックスの2つの最も紛らわしく誤解されているプロパティです。ただし、これらのプロパティは、コンボボックスを既に作成されたオブジェクトの値にバインドする場合に役立ちます。プロパティについての簡単なアイデアを得るために、次のリストの私の最後のシナリオを確認してください。
コレクションを使用してデータを格納するすべてのコントロールには、SelectedValue、SelectedItemプロパティがあります。これらのコントロールの例は、ListBox、Dropdown、RadioButtonList、CheckBoxListです。
より具体的には、選択したアイテムのテキストを文字通り取得したい場合は、次のように記述できます。
ListBox1.SelectedItem.Text;
ListBox1は、値が以前に設定されている場合、SelectedValueプロパティを使用してテキストを返すこともできます。しかし、上記はテキストを取得するためのより効果的な方法です。
現在、値はユーザーには表示されないものですが、主にデータベースに格納するために使用されます。ListBox1のテキストは挿入しませんが、挿入することもできますが、以前は選択したアイテムの値を挿入していました。価値を得るために私達は使うことができます
ListBox1.SelectedValue