2016-12-22 299 views
0

我想在WPF中綁定組合框。這是我的XAML:Combobox綁定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> 

這裏是我的代碼背後:

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

,並在構造函數中我已設置:

DataContext = this; 

但我的項目沒有顯示出來。還有什麼我需要做的?

+1

使您的ReportTypes屬性添加{get;設置;}並在您的構造器中創建新實例 –

+0

您無法綁定到**字段**。 – Sinatr

+0

是ReportType的名稱和類型字段或屬性?他們需要成爲財產。 – PaulF

回答

1

請注意,在下面的代碼中,不使用_reportTypes,而是使用ReportTypes會導致永久循環,因爲它會更新自己的永恆。

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

你忘了設置有吸附劑和的ObservableCollection的二傳手,使用綁定時getter和setter方法是非常重要的。

setter採用通過它的「值」並設置變量的值。

getter等待被調用,並在被調用時將變量值返回給調用它的項。

組合框屬性

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

設置模式和UpdateTrigger也經由該模式非常重要

可以設置組合框與結合的交互方式。

與UpdateSourceTrigger你可以告訴組合框等它被綁定到要更新的項目,然後它要求getter是否更新數據

+0

Observable集合已經實現INotifyPropertyChanged,你不必再次做它 –

+0

@NawedNabiZada你這樣做,如果你不NotifyPropertyChanged,它只是不更新​​....至少我的經驗 –

+0

@NawedNabiZada,試試這個解決方案,你會感到驚訝;)但是否則你是正確的:如果你沒有爲新實例設置價值,那麼就不需要提高通知率,例如只有getter的自動屬性才能完美實現,包括添加/刪除項目。 – Sinatr

1

如果你的組合框的項目只將是一個固定列表那麼你不需要可觀察的集合來實現綁定。如果您要修改ReportTypes並希望這些更改反映在組合框中,那麼您需要使用可觀察集合。

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