2016-04-25 2 views
0
<ComboBox 
    x:Name="comboBox" 
    Margin="281.4,160,259.995,159.958" 
    d:LayoutOverrides="Height" 
    ItemsSource="{Binding _US_STATES}" 
    SelectedIndex="0" 
    SelectedValue="{Binding SelectedState}" 
    SelectedValuePath="{Binding Path=_US_STATES/SHORT}" 
    > 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <Border Padding="2"> 
       <TextBlock Text="{Binding LONG}" /> 
      </Border> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

Das obige ist meine Xaml-Version einer ComboBox, die ich anzeige. Ich kann es richtig anzeigen, weil es die richtigen Daten anzeigt. Wenn ich versuche, den Wert zu erhalten, der ausgewählt ist, ist es immer RxTracking.model.US_STATES nicht der Wert, den es sein sollte.wpf Combobox SelectedValue Klassenname anstelle der Eigenschaft erhalten

Die US_STATES sieht wie folgt aus:

public class US_STATES : ObservableObject 
{ 
    private string _long; 
    private string _short; 

    public string LONG 
    { 
     get { return _long; } 
     set { Set("LONG", ref _long, value); } 
    } 

    public string SHORT 
    { 
     get { return _short; } 
     set { Set("SHORT", ref _short, value); } 
    } 

    public static ObservableCollection<US_STATES> GetAllStates() 
    { 
     ObservableCollection<US_STATES> ALL = new ObservableCollection<US_STATES> 
     { 
      new US_STATES {LONG="ALABAMA",SHORT="AL" }, 
      new US_STATES {LONG="Alaska", SHORT = "AK"}, 
      new US_STATES {LONG = "Arizona", SHORT = "AZ"}, 
      etc ... 

ich dies immer im Fehlerfenster ist:

System.Windows.Data Error: 40 : BindingExpression path error: 'AL' property not found on 'object' ''US_STATES' (HashCode=8402670)'. BindingExpression:Path=AL; DataItem='US_STATES' (HashCode=8402670); target element is 'ComboBox' (Name='comboBox'); target property is 'NoTarget' (type 'Object') 

System.Windows.Data Error: 40 : BindingExpression path error: 'AL' property not found on 'object' ''US_STATES' (HashCode=15232780)'. BindingExpression:Path=AL; DataItem='US_STATES' (HashCode=15232780); target element is 'ComboBox' (Name='comboBox'); target property is 'NoTarget' (type 'Object') 
+0

Mögliches Duplikat von [WPF IsEditable = true Mit Objekten gefüllte ComboBox zeigt die ToString() als ausgewähltes Element an] (https://stackoverflow.com/questions/1844156/wpf-iseditable-true-combobox-filled-with- Objekte-zeigt-die-Zahnring-als-die) –

Antwort

1

Die SelectedValuePath Eigenschaft eine Zeichenfolge ist. Es sollte der Name der Eigenschaft der Listenelementklasse sein, die Sie für den ausgewählten Wert verwenden möchten.

Wenn Sie die SHORT Eigenschaft US_STATES verwenden möchten, das ist einfach:

SelectedValuePath="SHORT" 

Das ist, warum es Heulen und Jammern über 'AL' property not found on 'object' ''US_STATES': Der SelectedValuePath mit dem Wert von _US_STATES/SHORT aktualisiert Bindung (das ist die „aktuelle Position“ , für die es die erste verwendet, da ObservableCollection keine CurrentItem -Eigenschaft hat - das wird in CollectionViewSource und ICollectionView, über die Sie sich keine Sorgen machen müssen, wenn Sie Sachen in XAML sortieren oder filtern, was " AL ". So versucht die ComboBox pflichtbewusst die AL Eigenschaft von US_STATES zu finden, die nicht existiert.

By the way, können Sie sich die Mühe ersparen, eine Vorlage zu schreiben und einfach eingestellt DisplayMemberPath:

DisplayMemberPath="LONG" 
0

Sie müssen die Anzeigewert-Eigenschaft auf dem Combobox setzen oder ToString in den Staaten Klasse außer Kraft setzen.

Was passiert ist, dass die Combobox ToString für die darin gespeicherten Objekte aufruft und wenn ToString nicht überschrieben wird, gibt es den Klassennamen zurück.