我有ObservableCollection项我想将这些数据绑定到我的comboBox。 如何用comboBox绑定数据? 我正在使用MVVM模式,所以建议我如何使用MVVM模式绑定数据
我正在尝试执行此代码但无法正常工作.. 在我的XAML PAGE中:
<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);
}
如何将这个combodata绑定到我的comboBox - 我做错了什么?
答案 0 :(得分:3)
首先:您的combodata
拥有私有访问修饰符,而非公开。第二个:combodata
必须是属性,而不是字段。并且您最好将INotifyPropertyChanged实现添加到您的课程中。
答案 1 :(得分: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
属性。
答案 2 :(得分: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属性。
答案 3 :(得分:1)
代码存在以下问题。
1.您不能绑定私人领域或财产。它应该是公共财产。
2.您只提供ItemsSource="{Binding Path=combodata}"
但未提供来源。 combodata来自哪里?
ObservableCollection无关,除非你的组合框项目在填充后不会改变。在这种情况下,List可以很好地工作。
要使其正常工作,请将您的combodata更改为公共属性
public ObservableCollection<Card> combodata {get;set;}
然后,
<ComboBox x:Name="comobo1"
DisplayMemberPath="CardTypeName"
SelectedValuePath="CardTypeID"
ItemsSource="{Binding Path=combodata}" ElementName=mainWindow>
</ComboBox>
通过指定ElementName,您告诉WPF绑定引擎查找mainWindow类的combodata属性。
我希望这会有所帮助。
答案 4 :(得分:1)
我最好的猜测是你的ComboBox的DataContext
未设置为ViewModel的实例
我经常使用Snoop来调试应用程序的DataContext问题。它允许您查看Visual Tree,并查看DataContext对所有控件的作用。
DataContext是UI绑定的数据。通常,DataContext在Visual Tree中设置得更高,例如在Window对象上,尽管作为示例,下面的代码行会将ComboBox的DataContext设置为ViewModel的新实例,然后您的ComboBox应该能够找到要绑定到它的combodata
集合。
comobo1.DataContext = new MyViewModel();
另外,将combodata
从Field
(无获取/设置访问者方法)更改为Property
(有关示例,请参阅Dmitriy's Answer)
答案 5 :(得分:0)
您需要绑定到公共属性。在您的示例中,combodata是私有的。
答案 6 :(得分: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>
在ViewModel中:
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);
}
}