2016-04-04 14 views
1

Ich habe eine liste mit Datenbindung in einem WPF-Steuerelement. Ich möchte nur den Text des ausgewählten Indexes. Wenn ich SelectedItem.ToString verwende, erhalte ich den Schlüssel und den Text. Wenn ich SelectedValue.ToString benutze bekomme ich nur den Schlüssel.Ruft den Text des ausgewählten Elements in einer WPF-Listbox ab.

Einige Foren haben Casting wie unten vorgeschlagen, aber das scheint nicht zu funktionieren.

InputName nameInput = new InputName((ListBoxItem)LbContractors.SelectedItem.ToString())); 

So binde ich die Kontrolle. Verarscht es das?

LbContractors.ItemsSource = myDictionary; 
LbContractors.SelectedValuePath = "Key"; 
LbContractors.DisplayMemberPath = "Value"; 
+0

Wenn Sie den Schlüssel bekommen, warum nicht nur erhalten der Wert aus dem Wörterbuch? –

+0

An diesem Punkt ist das Wörterbuch nicht mehr verfügbar. Ich lade die Artikel aus einer SQL-Datenbank. Ich benutze das Wörterbuch als temporärer Halter. Ich nehme an, ich könnte das Wörterbuch herumliegen lassen, aber warum kann ich nicht einfach den Text greifen wie in Winform. – Jeebwise

+0

Nun LbContractors hat immer noch eine Kopie davon, da es es braucht, so dass Sie es immer von LbContractors.ItemsSource greifen können. Obwohl es wahrscheinlich eine bessere Lösung gibt, ist dies nur eine Möglichkeit –

Antwort

4

Dies sollte den Trick tun.

(LbContractors.SelectedItem as ListBoxItem).Content.ToString(); 

UPDATE

Oder versuchen, dies zu tun. In Nullable KeyValuePair konvertieren und den Wert erhalten.

var kvp = (KeyValuePair<string, object>?) LbContractors.SelectedItem); 
if(kvp != null && kvp.Value != null) { 
    string selectedText = kvp.Value.ToString(); 
} 

In einer Zeile mit null Prüfung :)

string selectedText = ((KeyValuePair<string, object>?) LbContractors.SelectedItem)?.Value?.ToString(); 
+0

Wenn ich das verwende, bekomme ich eine Null-Referenz Ausnahme. Gibt es irgendwo etwas Besonderes, muss ich diesen Anruf benutzen. Im Moment versuche ich es in einem OnClick-Ereignis für ein Kontextmenü. – Jeebwise

+0

Siehe aktualisierte Antwort, lass mich wissen, wie es geht :) –

0

Warum nicht LblContractors.Text; verwenden, wenn das alles ist für Sie suchen?

0

warum kann ich nicht packen Sie einfach den Text, wie ich in winform tat

Man kann, wenn das Objekt richtig dereferenziert wird ....

Alles, was ich will, ist der Text des ausgewählten Indexes.

Aber was sollte der ToString() Text einer Rückkehr Key Value-Pair-Struktur wie pro Ihr Beispiel? Haben Sie ToString() überlastet?

Zwei Probleme zu lösen

  1. Sind Sie sicher, dass die SelectedItem nicht null ist? Überprüfen Sie vor dem Zugriff auf diesen Zustand.
  2. Man sollte auf die entsprechende Struktur gegossen (a KVP), anstatt blind ToString() und Referenz die entsprechende Eigenschaft von entweder Key oder Value aufrufen.

Ansonsten hier sind Beispiele.Die erste ist eine List-Box zu einem Wörterbuch gebunden

myDictionary = new Dictionary<string, string>() 
       { 
        {"Alpha", "The First Letter"}, 
        {"Beta", "The Second Letter"}, 
        {"Omega", "Omega Letter"}, 
       }; 

Wenn die Benutzer jedes Element auswählt, der Schlüssel und Wert zeigt in Textfeldern unter der List-Box:

enter image description here

Xaml

<ListBox Name="lbDictionary" 
      ItemsSource="{Binding myDictionary}" 
      SelectedValuePath="Key" 
      DisplayMemberPath="Value"/> 

Und der Zugriff auf sie in Textfelder (Ich zeige nicht die Etiketten von "Key" und „Wert“ der Kürze halber)

<TextBlock Text="{Binding SelectedItem.Key, ElementName=lbDictionary}"/> 
... 
<TextBlock Text="{Binding SelectedItem.Value, ElementName=lbDictionary}"/> 

daher für den Zugriff in Code hinter für Key als solche ist, würde Value gleich sein:

if (lbDictionary.SelectedItem != null) 
    MessageBox.Show(((KeyValuePair<string, string>) (lbDictionary.SelectedItem)).Key); 
else 
    MessageBox.Show("Select something"); 
Verwandte Themen