SelectedItem、SelectedValue、およびSelectedValuePathの違い


351

以下の違いは何ですか?

これらの依存関係プロパティはすべてSelectorクラスで定義されています。私はしばしば混同SelectedItemしてSelectedValue、そしてSelectedValue持ちますSelectedValuePath

それらの違いを知りたいのですが、いつ、特にSelectedValueとを使用するかについても知りたいSelectedValuePathです。いくつかの簡単な例でそれらの使用法を説明してください。


3
Beaには、説明とダウンロード可能なサンプルコードが記載されたブログ投稿があります... bea.stollnitz.com/blog/?p=9
Aaron McIver

2
[wpf ComboBox DisplayMemberPath、SelectedValueおよびSelectedValuePathと

回答:


552

それらの名前は少しわかりにくいかもしれません:)。ここに要約があります:

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

  • したがって、我々は持っているSelectedValuePathのプロパティとSelectedValueのを(あなたが相互に連携してそれらを使用)結合の代替手段としての性質を。Productビューがバインドされているオブジェクトがあるとします(ProductName、Weightなどのプロパティ)。またCategoryID、そのProductオブジェクトにプロパティがあり、ユーザーがカテゴリーのリストから製品のカテゴリーを選択できるようにしたいとします。CategoryIDProductオブジェクトのプロパティに割り当てるには、CategoryオブジェクトのIDプロパティが必要です。これはSelectedValuePathSelectedValueプロパティを入力します。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; }
}

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

クリス


8
説明ありがとう。Silverlightで本を書いたのと同じ人ですか?私はあなたと話しているとは思わない。:-)...私はこの本を最近読んでいます。本当に素晴らしい作品です。:-)
Nawaz、

22
うん、それは私です:)。私はこれらのパーツをぶらぶらして、可能な場合は質問に答えます。本を楽しんでくれてうれしいです:)。あなたが本を持っているので、あなたは、ページ69-70でこのトピックに関するより多くの情報を見つけることができますし、ページ204
クリス・アンダーソン

8
+1。+100。あなた、先生、小柄な男性の中で黄金の神です。神の祝福がありますように。:)真剣に、私はそれを理解するために2時間費やしました-ありがとう!
TarkaDaal 2012年

1
@Chris Anderson:Productオブジェクトに、CategoryIDではなく、Categoryプロパティ(タイプはCategory)がある場合はどうなりますか?バインディングを介してComboBoxの変更時にこのカテゴリプロパティを更新するにはどうすればよいですか?
Lucifer 14年

2
@Lucifer:この場合、次のようにSelectedItemプロパティを使用します。<ComboBox ItemsSource = "{Binding Categories}" SelectedItem = "{Binding Category、Mode = TwoWay}" />これがお役に立てば幸いです。
クリスアンダーソン、

69

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

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

あなたのリストボックスがのコレクションにバインドされている場合たとえば、Personそれぞれ有するオブジェクト、NameAge、およびGenderプロパティ、SelectedValuePath=Name選択の値が発生しますPersonNameプロパティがで返されますSelectedValue

表示するプロパティを指定するListBoxのControlTemplateをオーバーライドする(またはスタイルを適用する)場合、SelectedValuePathは使用できないことに注意してください。

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

(これは、TreeViewを使用したMSDNの別の例です

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

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


8

SelectedItemですobjectSelectedValueそして、SelectedValuePathしているstringの。

たとえば、ListBoxを使用します。

Give me listbox1.SelectedValueと言うと、現在選択されているアイテムのテキストが返されます。

string value = listbox1.SelectedValue;

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

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

3
SelectedValueでもあり、ではobjectありませんstring。Plsはここを
john_m 2017

5

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

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

SelectedValueおよびSelectedValuePath –これらは、コンボボックスの2つの最も混乱し、誤解されやすいプロパティです。しかし、これらのプロパティは、コンボボックスをすでに作成されたオブジェクトの値にバインドしたい場合に役立ちます。以下のリストの最後のシナリオを確認して、プロパティについて簡単に説明してください。


1

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

具体的には、文字通り選択したアイテムのテキストを取得したい場合は、次のように記述できます。

ListBox1.SelectedItem.Text;

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

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

ListBox1.SelectedValue

ソース

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.