以下の違いは何ですか?
これらの依存関係プロパティはすべてSelectorクラスで定義されています。私はしばしば混同SelectedItem
してSelectedValue
、そしてSelectedValue
持ちますSelectedValuePath
。
それらの違いを知りたいのですが、いつ、特にSelectedValue
とを使用するかについても知りたいSelectedValuePath
です。いくつかの簡単な例でそれらの使用法を説明してください。
以下の違いは何ですか?
これらの依存関係プロパティはすべてSelectorクラスで定義されています。私はしばしば混同SelectedItem
してSelectedValue
、そしてSelectedValue
持ちますSelectedValuePath
。
それらの違いを知りたいのですが、いつ、特にSelectedValue
とを使用するかについても知りたいSelectedValuePath
です。いくつかの簡単な例でそれらの使用法を説明してください。
回答:
それらの名前は少しわかりにくいかもしれません:)。ここに要約があります:
SelectedItemプロパティは、リストがバインドされているオブジェクト全体を返します。したがって、リストをCategory
オブジェクトのコレクションにバインドしたとします(各CategoryオブジェクトにはNameプロパティとIDプロパティがあります)。例えば。ObservableCollection<Category>
。SelectedItem
プロパティは、あなたの現在選択されて返されCategory
たオブジェクトを。ただし、バインドの目的では、必ずしもこれが必要なわけではありません。これは、Categoryオブジェクト全体を、リストがバインドされているプロパティにバインドできるだけであり、Categoryオブジェクトの単一のプロパティ(そのID
プロパティなど)の値ではないためです。)。
したがって、我々は持っているSelectedValuePathのプロパティとSelectedValueのを(あなたが相互に連携してそれらを使用)結合の代替手段としての性質を。Product
ビューがバインドされているオブジェクトがあるとします(ProductName、Weightなどのプロパティ)。またCategoryID
、そのProductオブジェクトにプロパティがあり、ユーザーがカテゴリーのリストから製品のカテゴリーを選択できるようにしたいとします。CategoryID
Productオブジェクトのプロパティに割り当てるには、CategoryオブジェクトのIDプロパティが必要です。これは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; }
}
最初は少し混乱しますが、うまくいけば少しわかりやすくなります... :)
クリス
もう少し概念的に答えるには:
SelectedValuePath
ListBoxにバインドされたオブジェクトのどのプロパティを(その名前で)ItemsSource
アイテムのとして使用するかを定義しますSelectedValue
。
あなたのリストボックスがのコレクションにバインドされている場合たとえば、Person
それぞれ有するオブジェクト、Name
、Age
、およびGender
プロパティ、SelectedValuePath=Name
選択の値が発生しますPerson
のName
プロパティがで返されますSelectedValue
。
表示するプロパティを指定するListBoxのControlTemplateをオーバーライドする(またはスタイルを適用する)場合、SelectedValuePath
は使用できないことに注意してください。
SelectedItem
一方、Person
現在選択されているオブジェクト全体を返します。
(これは、TreeViewを使用したMSDNの別の例です)
更新: @Joeが指摘したように、DisplayMemberPathプロパティはSelected *プロパティとは無関係です。その適切な説明は次のとおりです。
これらの値はDisplayMemberPath
(SelectorではなくItemsControlで定義されている)とは異なりますが、そのプロパティの動作はSelectedValuePath
次のとおりです。スタイル/テンプレートがない場合、アイテムにバインドされているオブジェクトのどのプロパティを文字列表現。
SelectedItem
ですobject
。
SelectedValue
そして、SelectedValuePath
しているstring
の。
たとえば、ListBoxを使用します。
Give me 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