2011-12-29 53 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); 
        } 
       }