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

WPF 将集合绑定到 ComboBox 并选择一个项目

WPF ComboBox ItemTemplate 绑定到字符串集合

将 wpf:ComboBox 绑定到 XAML 中的静态类

Wpf的comboBox怎么绑定数据?

WPF MVVM 将 ComboBox 绑定到 Datagrid 选定项