[英]ObservableCollection or List data bind with comboBox using MVVM?
我有ObservableCollection项目,我想将此数据绑定到我的comboBox。 如何用comboBox绑定数据? 我正在使用MVVM模式,因此建议我如何使用MVVM模式绑定数据
我正在尝试执行此代码,但无法正常工作。 在我的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);
}
如何将此组合数据绑定到我的comboBox-我在做什么错?
首先:您的combodata
具有private访问修饰符,而不是public 。 第二点: combodata
必须是属性,而不是field 。 并且最好将INotifyPropertyChanged实现添加到您的类中。
您必须绑定到应该实现INotifyPropertyChanged
的视图模型的公共属性。
这是您应该做的:
视图:
<ComboBox x:Name="comobo1" DisplayMemberPath="CardTypeName" SelectedValuePath="CardTypeID" ItemsSource="{Binding Path=ComboData}" />
ViewModel:
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
属性。
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属性。
代码存在以下问题。
1.您不能绑定到私有字段或属性。 它应该是公共财产。
2.您仅提供了ItemsSource="{Binding Path=combodata}"
但没有提供源。 组合数据来自哪里?
ObservableCollection无关,除非您的组合框项目一旦填充就不会更改。 在这种情况下,列表可以很好地工作。
要使其正常工作,请将您的组合数据更改为
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属性。
我希望这有帮助。
我最好的猜测是您的ComboBox的DataContext
未设置为ViewModel的实例
我经常使用Snoop来调试应用程序的DataContext问题。 它允许您查看您的可视树,并查看所有控件的DataContext。
DataContext是您的UI绑定到的数据。 通常,将DataContext设置在可视树中较高的位置,例如在Window对象上,但作为示例,下面的代码行会将ComboBox的DataContext设置为ViewModel的新实例,然后ComboBox应该能够找到绑定到它的combodata
集合。
comobo1.DataContext = new MyViewModel();
另外,将combodata
从Field
(无get / set访问器方法)更改为Property
(有关示例,请参见Dmitriy的答案 )
您需要绑定到公共财产。 在您的示例中,combodata是私有的。
正确答案是:
在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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.