it-swarm.com.de

Unterschied zwischen SelectedItem, SelectedValue und SelectedValuePath

Was ist der Unterschied zwischen:

Alle diese Abhängigkeitseigenschaften werden in der Klasse Selector definiert. Ich verwechsle oft SelectedItem mit SelectedValue und SelectedValue mit SelectedValuePath.

Ich möchte den Unterschied zwischen ihnen kennen und auch, wann wir sie benutzen, besonders SelectedValue und SelectedValuePath. Bitte erläutern Sie deren Verwendung anhand einiger einfacher Beispiele.

329
Nawaz

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

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

  • Daher haben wir die Eigenschaft SelectedValuePath und die Eigenschaft SelectedValue als alternative Bindungsmethode (Sie verwenden sie in Verbindung miteinander). Angenommen, Sie haben ein Product - Objekt, an das Ihre Ansicht gebunden ist (mit Eigenschaften für Dinge wie ProductName, Weight usw.). Angenommen, Sie haben eine CategoryID - Eigenschaft 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 CategoryID -Eigenschaft des Product-Objekts zuweisen. Hier kommen die Eigenschaften SelectedValuePath und SelectedValue ins Spiel. Sie geben an, dass die ID-Eigenschaft des Category-Objekts der Eigenschaft des Product-Objekts zugewiesen werden soll, für das die Liste SelectedValuePath='ID' Und binden Sie dann die Eigenschaft SelectedValue 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 angezeigt wird (mit der DisplayMemberPath-Eigenschaft).

<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 ein bisschen klarer ... :)

Chris

519
Chris Anderson

Um etwas konzeptioneller zu antworten:

SelectedValuePath definiert, welche Eigenschaft (anhand ihres Namens) der Objekte, die an das ItemsSource der ListBox gebunden sind, als SelectedValue des Elements verwendet wird.

Wenn Ihre ListBox beispielsweise an eine Sammlung von Person Objekten gebunden ist, von denen jedes die Eigenschaften Name, Age und Gender hat, SelectedValuePath=Name bewirkt, dass der Wert der Eigenschaft Person der ausgewählten Name in SelectedValue zurückgegeben wird.

Beachten Sie, dass SelectedValuePath nicht verwendet werden kann, wenn Sie das ControlTemplate der ListBox überschreiben (oder einen Style anwenden), der angibt, welche Eigenschaft angezeigt werden soll.

Währenddessen gibt SelectedItem das gesamte aktuell ausgewählte Person Objekt zurück.

(Hier ist ein weiteres Beispiel aus MSDN , mit TreeView)

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

Beachten Sie, dass sich diese Werte von DisplayMemberPath (definiert in ItemsControl und nicht in Selector) unterscheiden. Diese Eigenschaft hat jedoch ein ähnliches Verhalten wie SelectedValuePath: Wenn kein Stil/keine Vorlage vorhanden ist, gibt sie an, welche Die Eigenschaft des an item gebundenen Objekts sollte als Zeichenfolgendarstellung verwendet werden.

65
Dan J

SelectedItem ist ein object. SelectedValue und SelectedValuePath sind strings.

zum Beispiel mit der ListBox:

wenn du sagst gib mir listbox1.SelectedValue Gibt den Text des aktuell ausgewählten Elements zurück.

string value = listbox1.SelectedValue;

wenn du sagst gib mir listbox1.SelectedItem es wird Ihnen das gesamte Objekt geben.

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

inspiriert von dieser frage habe ich ein blog zusammen mit dem code snippet hier geschrieben. Nachfolgend einige Auszüge aus dem Blog

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

SelectedValue und SelectedValuePath - Dies sind die beiden verwirrendsten und falsch interpretierten Eigenschaften für Combobox. Diese Eigenschaften werden jedoch wirksam, 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.

5
Vikram

Jedes Steuerelement, das zum Speichern von Daten Sammlungen 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 mit der SelectedValue-Eigenschaft zurückgeben, wenn der Wert zuvor auf diesen Wert festgelegt wurde. Aber oben ist ein effektiverer Weg, um Text zu bekommen.

Jetzt ist der Wert 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 aber auch einfügen, sondern haben den Wert des ausgewählten Elements eingefügt. Um Wert zu bekommen, können wir verwenden

ListBox1.SelectedValue

Quelle

1
kamalpreet