WPF ComboBox 绑定到 ObservableCollection
Posted
技术标签:
【中文标题】WPF ComboBox 绑定到 ObservableCollection【英文标题】:WPF ComboBox Binding to ObservableCollection 【发布时间】:2013-04-18 08:30:41 【问题描述】:我是 WPF 新手,我有一个问题。 我有组织模块:
class Organization : ObservableObject
public string OrganizationName get; set;
我有组织的 ViewModel:
class OrganizationViewModel : ObservableObject
int _count = 0;
public OrganizationViewModel()
Organization = new Organization OrganizationName = "New Organization";
public Organization Organization get; set;
public string OrganizationName
get return Organization.OrganizationName;
set
if(Organization.OrganizationName != value)
Organization.OrganizationName = value;
RaisePropertyChanged("OrganizationName");
我拥有所有组织的 ViewModel:
class AllOrganizationsViewModel
private ObservableCollection<OrganizationViewModel> m_organizations = new ObservableCollection<OrganizationViewModel>();
public ObservableCollection<OrganizationViewModel> Organizations
get return m_organizations;
set m_organizations = value;
public AllOrganizationsViewModel()
for(int i = 0; i < 3; ++i)
m_organizations.Add(new OrganizationViewModel());
void AddOrganizationNameExecute()
m_organizations.Add(new OrganizationViewModel());
bool CanAddOrganizationNameExecute()
return true;
public ICommand AddOrganizationgetreturn new RelayCommand(AddOrganizationNameExecute, CanAddOrganizationNameExecute);
这是 MainWindow.xaml:
<Window x:Class="DataIntegrityChecker.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:DataIntegrityChecker.ViewModels" Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<local:AllOrganizationsViewModel />
</Window.DataContext>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="285*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="156" />
<ColumnDefinition Width="347*" />
</Grid.ColumnDefinitions>
<Label Content="Organization: " Margin="0,0,44,0" />
<Button Grid.Row="1" Name="UpdateOrganizations" Content="Update Organization Name" Command="Binding AddOrganization" Margin="0,0,0,262" HorizontalAlignment="Left" Width="156" />
<ComboBox Grid.Column="1" Grid.Row="1" Height="23" HorizontalAlignment="Left" Name="comboBox1" VerticalAlignment="Top" Width="155" ItemsSource="Binding Organizations" />
</Grid>
</Window>
现在,我在 ComboBox 项目中得到的是类 OrganizationViewModel 的名称,但我需要的是 OrganizationName 字符串。在我看来,我缺少一些与 OrganizationName 的绑定,但我不知道在哪里添加 if(如果这是问题的话)。我假设我可以用我需要的组织的名称制作一个字符串集合。但是将来我需要在 Organization Class 中添加更多属性,这就是我需要它的工作方式。
我将不胜感激任何帮助
【问题讨论】:
【参考方案1】:您需要添加DisplayMemberPath
:
<ComboBox Grid.Column="1" Grid.Row="1" Height="23" HorizontalAlignment="Left" Name="comboBox1" VerticalAlignment="Top" Width="155" ItemsSource="Binding Organizations"
DisplayMemberPath="OrganizationName"/>
【讨论】:
太棒了!谢谢它有效,我想我真的试过了,所以我可能弄错了。 这几乎是不可能调试的。当列表中没有显示任何内容时,任何人都应该知道缺少这样的属性吗?无论如何,它对我不起作用。我将 ItemSource 绑定到 DataContext 上的 ObservableCollection。ItemsSource="Binding Projects, Mode=OneWay"
,其中Projects
是我的数据上下文对象实例上的 ObservableCollection 的属性名称。
确保您使用的是正确的DisplayMemberPath
,它应该是具有公共访问器的属性。此外,如果您有绑定错误,您可以在调试期间使用Output Window
在 VS 中查看它们。【参考方案2】:
另一种方法是定义 ItemTemplate。它提供了更多的显示灵活性
<ComboBox Grid.Column="1" Grid.Row="1" Height="23" HorizontalAlignment="Left" Name="comboBox1" VerticalAlignment="Top" Width="155" ItemsSource="Binding Organizations" >
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="Binding OrganizationName"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
【讨论】:
以上是关于WPF ComboBox 绑定到 ObservableCollection的主要内容,如果未能解决你的问题,请参考以下文章
如何将通用项目添加到绑定到 WPF 中的集合的 ComboBox