Unterschied zwischen SelectedItem, SelectedValue und SelectedValuePath

351

Was ist der Unterschied zwischen den folgenden:

Alle diese Abhängigkeitseigenschaften werden in der Selector- Klasse definiert . Ich verwechsle oft SelectedItemmit SelectedValueund SelectedValuemit SelectedValuePath.

Ich würde gerne den Unterschied zwischen ihnen kennen und auch, wann wir sie verwenden, insbesondere SelectedValueund SelectedValuePath. Bitte erläutern Sie deren Verwendung anhand einiger einfacher Beispiele.

Nawaz
quelle
3
Bea hat einen Blog-Beitrag mit Erklärungen und Beispielcode, den Sie herunterladen können ... bea.stollnitz.com/blog/?p=9
Aaron McIver
2
Mögliches Duplikat von [Verwechselt mit wpf ComboBox DisplayMemberPath, SelectedValue und SelectedValuePath] ( stackoverflow.com/questions/3797034/… )

Antworten:

552

Ihre Namen können etwas verwirrend sein :). Hier ist eine Zusammenfassung:

  • Die SelectedItem- Eigenschaft gibt das gesamte Objekt zurück, an das Ihre Liste gebunden ist. Angenommen, Sie haben eine Liste an eine Sammlung von CategoryObjekten gebunden (wobei jedes Kategorieobjekt die Eigenschaften Name und ID hat). z.B. ObservableCollection<Category>. Die SelectedItemEigenschaft gibt Ihnen das aktuell ausgewählte CategoryObjekt zurück. Für Bindungszwecke ist dies jedoch nicht immer das, was Sie möchten, da Sie damit nur ein gesamtes Kategorieobjekt an die Eigenschaft binden können, an die die Liste gebunden ist, nicht den Wert einer einzelnen Eigenschaft für dieses Kategorieobjekt (z. B. dessen IDEigenschaft) ).

  • Daher haben wir die SelectedValuePath- Eigenschaft und die SelectedValue- Eigenschaft als alternative Bindungsmethode (Sie verwenden sie in Verbindung miteinander). ProductAngenommen, Sie haben ein Objekt, an das Ihre Ansicht gebunden ist (mit Eigenschaften für Dinge wie Produktname, Gewicht usw.). Angenommen, Sie haben eine CategoryIDEigenschaft für dieses Produktobjekt und möchten, dass der Benutzer eine Kategorie für das Produkt aus einer Liste von Kategorien auswählen kann. Sie müssen die ID-Eigenschaft des Category-Objekts der CategoryIDEigenschaft im Product-Objekt zuweisen . Hier ist das SelectedValuePathund dasSelectedValueEigenschaften kommen herein. Sie geben an, dass die ID-Eigenschaft des Category-Objekts der Eigenschaft des Product-Objekts zugewiesen werden soll, an die die Liste gebunden ist SelectedValuePath='ID', und binden die SelectedValueEigenschaft dann an die Eigenschaft im DataContext (dh das Produkt).

Das folgende Beispiel zeigt dies. Wir haben eine ComboBox, die an eine Liste von Kategorien gebunden ist (über ItemsSource). Wir binden die CategoryID-Eigenschaft für das Produkt als ausgewählten Wert (mithilfe der SelectedValue-Eigenschaft). Wir verknüpfen dies mit der ID-Eigenschaft der Kategorie über die SelectedValuePath-Eigenschaft. Und wir sagen, dass nur die Name-Eigenschaft in der ComboBox mit der DisplayMemberPath-Eigenschaft angezeigt wird.

<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; }
}

Es ist anfangs etwas verwirrend, aber hoffentlich wird es dadurch etwas klarer ... :)

Chris

Chris Anderson
quelle
8
Danke für die Erklärung. Bist du derselbe, der ein Buch über Silverlight geschrieben hat? Ich glaube nicht, dass ich mit dir rede. : -) ... Ich lese dieses Buch heutzutage. Wirklich eine großartige Arbeit. :-)
Nawaz
22
Ja, das bin ich :). Ich hänge hier an diesen Teilen herum, um Fragen zu beantworten, wenn ich kann. Ich bin froh, dass du das Buch genießt :). Da Sie das Buch haben, finden Sie weitere Informationen zu diesem Thema auf den Seiten 69-70 und Seite 204.
Chris Anderson
8
+1. +100. Sie, Sir, sind ein goldener Gott unter den kleineren Männern. Möge Gott Sie und alle, die in Ihnen segeln, segnen. :) Im Ernst, ich habe gerade zwei Stunden damit verbracht, das herauszufinden - danke!
TarkaDaal
1
@ Chris Anderson: Was ist, wenn das Product-Objekt eine Category-Eigenschaft (Typ Category) anstelle einer CategoryID hat? Wie kann ich diese Category-Eigenschaft bei der Änderung von ComboBox durch Bindung aktualisieren?
Luzifer
2
@Lucifer: In diesem Fall würden Sie die SelectedItem-Eigenschaft folgendermaßen verwenden: <ComboBox ItemsSource = "{Bindungskategorien}" SelectedItem = "{Bindungskategorie, Modus = Zwei Wege}" /> Hoffe, dies hilft.
Chris Anderson
69

Um etwas konzeptioneller zu antworten:

SelectedValuePathDefiniert, welche Eigenschaft (anhand ihres Namens) der an die ListBox gebundenen Objekte ItemsSourceals Objekt verwendet wird SelectedValue.

Zum Beispiel wird , wenn Ihre List - Box auf eine Sammlung von gebundenen PersonObjekten, von denen jedem hat Name, Ageund GenderEigenschaften, SelectedValuePath=Nameden Wert der ausgewählten verursachen Person‚s - NameEigenschaft in zurückgegeben werden SelectedValue.

Beachten Sie, dass das ControlTemplate der ListBox (oder das Anwenden eines Stils), das angibt, welche Eigenschaft angezeigt werden soll, SelectedValuePathnicht verwendet werden kann , wenn Sie es überschreiben .

SelectedItemIn der Zwischenzeit wird das gesamte Personaktuell ausgewählte Objekt zurückgegeben.

(Hier ist ein weiteres Beispiel von MSDN mit TreeView.)

Update: Wie @Joe hervorhob, hat die DisplayMemberPath-Eigenschaft keine Beziehung zu den Selected * -Eigenschaften. Die richtige Beschreibung folgt:

Beachten Sie, dass sich diese Werte von denen unterscheiden DisplayMemberPath(die in ItemsControl und nicht in Selector definiert sind), diese Eigenschaft jedoch ein ähnliches Verhalten aufweist wie SelectedValuePath: Wenn kein Stil / keine Vorlage vorhanden ist, gibt sie an, welche Eigenschaft des an das Element gebundenen Objekts als dessen verwendet werden soll Zeichenfolgendarstellung.

Dan J.
quelle
8

SelectedItemist ein object. SelectedValueund SelectedValuePathsind strings.

Zum Beispiel mit der ListBox:

Wenn Sie "Gib mir" sagen, listbox1.SelectedValuewird der Text des aktuell ausgewählten Elements zurückgegeben.

string value = listbox1.SelectedValue;

Wenn du sagst, gib mir listbox1.SelectedItem, dann bekommst du das gesamte Objekt.

ListItem item = listbox1.SelectedItem;
string value = item.value;
Capdragon
quelle
3
SelectedValueist auch ein objectund kein string. Pls sehen hier
john_m
5

Inspiriert von dieser Frage habe ich hier einen Blog zusammen mit dem Code-Snippet geschrieben . Nachfolgend einige Auszüge aus dem Blog

SelectedItem - Selected Item hilft dabei, den tatsächlichen Wert aus der anzuzeigenden DataSource zu binden. Dies ist vom Typ Objekt und wir können jeden vom Objekttyp abgeleiteten Typ mit dieser Eigenschaft binden. Da wir in diesem Fall die MVVM-Bindung für unsere Kombinationsfelder verwenden, ist dies die Eigenschaft, mit der wir VM benachrichtigen können, dass das Element ausgewählt wurde.

SelectedValue und SelectedValuePath - Dies sind die beiden verwirrendsten und falsch interpretierten Eigenschaften für Combobox. Diese Eigenschaften werden jedoch behoben, wenn wir unsere Combobox mit dem Wert eines bereits erstellten Objekts verknüpfen möchten. Bitte überprüfen Sie mein letztes Szenario in der folgenden Liste, um eine kurze Vorstellung von den Eigenschaften zu erhalten.

Vikram
quelle
1

Jedes Steuerelement, das Sammlungen zum Speichern von Daten verwendet, verfügt über die SelectedValue- und SelectedItem-Eigenschaft. Beispiele für diese Steuerelemente sind ListBox, Dropdown, RadioButtonList, CheckBoxList.

Um genauer zu sein, wenn Sie buchstäblich den Text des ausgewählten Elements abrufen möchten, können Sie Folgendes schreiben:

ListBox1.SelectedItem.Text;

Ihre ListBox1 kann auch Text mithilfe der SelectedValue-Eigenschaft zurückgeben, wenn der Wert zuvor festgelegt wurde. Aber oben ist effektiver, um Text zu bekommen.

Der Wert ist für den Benutzer nicht sichtbar, wird jedoch hauptsächlich zum Speichern in der Datenbank verwendet. Wir fügen keinen Text von ListBox1 ein, können ihn jedoch auch einfügen, aber wir haben den Wert des ausgewählten Elements eingefügt. Um Wert zu erhalten, können wir verwenden

ListBox1.SelectedValue

Quelle

Kamalpreet
quelle