2016-12-22 5 views
0

Ich versuche, Combobox in WPF zu binden. Hier ist meine XAML:Combobox-Bindung WPF

<ComboBox x:Name="cmbRptType" HorizontalAlignment="Left" Margin="10,10,0,0" ItemsSource="{Binding Path=ReportTypes}" SelectedValuePath="Type" DisplayMemberPath="Name" VerticalAlignment="Top" Width="198"> 

     </ComboBox> 

Hier ist mein Code hinter:

public ObservableCollection<ReportType> ReportTypes = new ObservableCollection<ReportType>() 
     { 
      new ReportType() { Name = "Store", Type = REPORT_TYPE.STORE }, 
      new ReportType() { Name = "Customer", Type = REPORT_TYPE.CUSTOMERS } 
     }; 

und im Konstruktor ich gesetzt haben:

DataContext = this; 

Aber meine Artikel werden nicht angezeigt. Gibt es noch etwas, was ich tun muss?

+1

Machen Sie Ihre ReportTypes zu einer Eigenschaft, indem Sie {get; set;} und erstellen Sie eine neue Instanz in Ihrem Konstruktor –

+0

Sie können nicht an ein ** Feld ** binden. – Sinatr

+0

Sind Name & Type-Felder oder Eigenschaften von ReportType? Sie müssen Eigenschaften sein. – PaulF

Antwort

1

Hinweis im folgenden Code, nicht mit _reportTypes und stattdessen mit ReportTypes würde eine ewige Schleife ergeben, wie es sich für die Ewigkeit aktualisieren würde.

private ObservableCollection<ReportType> _reportTypes 
public ObservableCollection<ReportType> ReportTypes 
    { 
    get{return _reportTypes;} 
    set 
    { 
     _reportTypes = value; 
     NotifyPropertyChanged(m => m.ReportTypes); 
    } 
    } 

Sie die Getter und Setter, die von der ObservableCollection zu setzen vergessen, Getter und Setter sind sehr wichtig, wenn Bindung verwenden.

Der Setter nimmt den "Wert", den Sie übergeben, und legt den Wert der Variablen fest.

Der Getter wartet darauf aufgerufen zu werden, und wenn er aufgerufen wird, gibt er den Variablenwert an das Element zurück, das ihn aufgerufen hat.

Combobox Eigenschaft

ItemsSource="{Binding ReportTypes,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 

den Modus und die UpdateTrigger Einstellung ist auch

über den Modus sehr wichtig, dass Sie die Art und Weise, mit der Bindung der Combobox in Wechselwirkung einstellen.

mit dem Update Sie die Combobox sagen kann, für das Element zu warten, es binded wird aktualisiert werden, und dann fragt es den Getter für die aktualisierten Daten

+0

Observable Sammlung implementiert bereits INotifyPropertyChanged, müssen Sie es nicht noch einmal tun –

+0

@NawedNabiZada Sie tun, wenn Sie NotifyPropertyChanged, es aktualisiert nur nicht .... atleast zu meiner Erfahrung –

+0

@NawedNabiZada, versuchen Sie diese Lösung und Sie Werde überrascht sein;) Aber sonst hast du Recht: Wenn du keinen Wert auf eine neue Instanz setzt, brauchst du keine Benachrichtigung zu erhöhen, z Auto-Property mit Getter allein wird perfekt funktionieren, einschließlich Hinzufügen/Löschen von Elementen. – Sinatr

1

Wenn Ihr Combobox Elemente nur eine feste Liste sein werden dann brauchen Sie keine beobachtbare Sammlung, um eine Bindung zu erreichen. Wenn Sie ReportTypes ändern und diese Änderungen in der Combobox widerspiegeln möchten, müssen Sie die beobachtbare Sammlung verwenden.

public enum REPORT_TYPE 
{ 
    STORE, 
    CUSTOMERS 
} 

public class ReportType 
{ 
    public string Name { get; set; } 
    public REPORT_TYPE Type { get; set; } 
} 

public List<ReportType> ReportTypes { get; set; } = new List<ReportType>() 
{ 
    new ReportType() { Name = "Store", Type = REPORT_TYPE.STORE }, 
    new ReportType() { Name = "Customer", Type = REPORT_TYPE.CUSTOMERS } 
};