2011-12-29 55 views
0

我有ObservableCollection項目我想要綁定這個數據到我的組合框。 如何使用comboBox綁定數據? 我使用MVVM模式,使建議我使用MVVM模式ObservableCollection或List數據使用MVVM與comboBox綁定?

我試圖做到這一點的代碼,但不能正常工作如何將數據綁定.. 在我的XAML頁面:

<ComboBox x:Name="comobo1" 
      DisplayMemberPath="CardTypeName" 
      SelectedValuePath="CardTypeID" 
      ItemsSource="{Binding Path=combodata}">  
</ComboBox> 

在我的ViewModel
Card是我的模型)

public ObservableCollection<Card> combodata = new ObservableCollection<Card>(); 
foreach (var item in App.db.States) 
{ 
    Card c = new Card(item.StateName, item.StateID); 
    combodata.Add(c); 
} 

何w將這個combodata綁定到我的comboBox - 我做錯了什麼?

回答

3

起初:您combodata私人訪問修飾符,而不是公共。第二位:combodata必須是財產但不是字段。你最好添加INotifyPropertyChanged實現到你的課堂。

+0

做公益然後不工作 – Ashwin 2011-12-29 12:31:02

+2

它仍然是一個後場。將其更改爲'public ObservableCollection combodata {get;組; } – snurre 2011-12-29 16:34:20

0

您需要綁定到公共屬性。在你的例子中,combodata是私人的。

+0

做公開然後不工作 – Ashwin 2011-12-29 12:31:21

+1

你應該將它綁定到public(!)屬性(!)。在你的代碼中,你試圖綁定到公共領域。 – Dmitriy 2011-12-29 12:39:19

2

你必須綁定到應該實現INotifyPropertyChanged的視圖模型的公共屬性。

這裏是你應該做的:

查看:

<ComboBox x:Name="comobo1" DisplayMemberPath="CardTypeName" SelectedValuePath="CardTypeID" ItemsSource="{Binding Path=ComboData}" /> 

視圖模型:

public class MyViewModel : INotifyPropertyChanged 
    { 
     private ObservableCollection<Card> comboData; 

     public event PropertyChangedEventHandler PropertyChanged; 

     public ObservableCollection<Card> ComboData 
     { 
      get 
      { 
       return this.comboData; 
      } 

      set 
      { 
       if (this.comboData != value) 
       { 
        this.comboData = value; 
        this.NotifyPropertyChanged("ComboData"); 
       } 
      } 
     } 

     private void NotifyPropertyChanged(String info) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(info)); 
      } 
     } 
    } 

編輯:你還需要設置你的觀點的DataContext財產。最簡單的方法是將ViewModel的實例影響到視圖代碼隱藏的DataContext屬性。

+0

此解決方案不起作用 – Ashwin 2011-12-29 12:43:04

+0

Ashwin,請嘗試檢查DataContext屬性。 – Dmitriy 2011-12-29 12:46:08

+0

您是否爲您的視圖設置了datacontext?.... – ken2k 2011-12-29 12:46:48

2
private ObservableCollection<Card> _combodata; 
Public ObservableCollection<Card> comboData 
{ 
    get 
    { 
     if (_combodata == null) 
     _combodata = new ObservableCollection<Card>(); 
     return _combodata; 
    } 
    set 
    { 
     if (value != _combodata) 
      _combodata = value; 
    } 
} 


<ComboBox x:Name="comobo1" 
     DisplayMemberPath="CardTypeName" 
     SelectedValuePath="CardTypeID" 
     ItemsSource="{Binding Path=comboData}">  
</ComboBox> 

並且不要忘記設置一個DataContext屬性。

+0

沒有在combobox中獲得價值 – Ashwin 2011-12-29 12:46:12

+0

在datacontext中檢查datacontext – Dmitriy 2011-12-29 12:47:25

+0

哪些數據給我? – Ashwin 2011-12-29 12:48:10

1

代碼存在以下問題。

1.您無法綁定到私人字段或屬性。它應該是公共財產。

2.您只提供ItemsSource="{Binding Path=combodata}"但未提供來源。 combodata從哪裏來?

ObservableCollection無關緊要,除非您的組合框項目一旦填充後不會更改。在這種情況下List可以很好地工作。

要通過指定的ElementName你告訴WPF綁定引擎來尋找主窗口的combodata屬性使其工作,你combodata更改爲公共財產

public ObservableCollection<Card> combodata {get;set;} 

然後,

<ComboBox x:Name="comobo1" 
      DisplayMemberPath="CardTypeName" 
      SelectedValuePath="CardTypeID" 
      ItemsSource="{Binding Path=combodata}" ElementName=mainWindow>  
</ComboBox> 

類。

我希望這會有所幫助。

1

我最好的猜測是你的組合框的DataContext沒有設置爲您的視圖模型

的一個實例,我經常使用Snoop調試的DataContext與應用程序的問題。它允許您查看可視樹,並查看DataContext適用於所有控件。

DataContext是UI綁定的數據。通常DataContext在Visual Tree中設置得比較高,比如在Window對象上,儘管下面這行代碼會將ComboBox的DataContext設置爲ViewModel的一個新實例,然後你的ComboBox應該能夠找到combodata集合綁定到它。

comobo1.DataContext = new MyViewModel(); 

此外,您combodataField(沒有get/set訪問方法)更改爲Property(見Dmitriy's Answer爲例)

+0

但我的組合1位於dataTemplate中,而不是直接在我的xaml中使用。所以我不能得到comboBox在我的代碼後面給datacontext到我的combobox – Ashwin 2011-12-30 04:56:50

+0

我得到的數據,如果我把我的combobox從dataTemplate中,但我無法獲取DataTemplate中的數據我如何使用所有代碼都用盡datatemplate但不dataTemplate – Ashwin 2011-12-30 05:05:15

+0

@Ashwin然後在包含模板化組合框的UI中設置任何控件的DataContext。當它被渲染時,ComboBox將從該控件繼承它的DataContext。 – Rachel 2011-12-30 14:45:05

0

正確答案是:

在XAML PAGE」 :

<CollectionViewSource x:Key="comboBoxCollection" Source="{Binding comboData}"></CollectionViewSource> 
    <DataTemplate x:Key="ComboBoxDataTemplate"> 
      <Grid MinHeight="25"> 
       <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="*" /> 
       </Grid.ColumnDefinitions> 
        <ComboBox x:Name="comobo1" DisplayMemberPath="CardTypeName" SelectedValuePath="CardTypeID" ItemsSource="{Binding Source={StaticResource comboBoxCollection }}"> 
        </ComboBox> 
      </Grid> 
     </DataTemplate> 

在視圖模型:

private ObservableCollection<Card> _combodata; 

     public ObservableCollection<Card> comboData 
     { 
      get 
      { 
       if (_combodata == null) 
        _combodata = new ObservableCollection<Card>(); 
       return _combodata; 
      } 
      set 
      { 
       if (value != _combodata) 
        _combodata = value; 
      } 
     } 

    if (_objCardField.FieldTag == "State") 
       { 
        cards = new Cards(); 
        foreach (var item in App.db.States) 
        { 
         Card c = new Card(item.StateName, item.StateID); 
         comboData.Add(c); 
        } 
       }