如何将通用项目添加到绑定到 WPF 中的集合的 ComboBox

Posted

技术标签:

【中文标题】如何将通用项目添加到绑定到 WPF 中的集合的 ComboBox【英文标题】:How do you add a generic item to a ComboBox bound to a collection in WPF 【发布时间】:2011-01-10 05:42:09 【问题描述】:

我在 WPF 应用程序中有一个 ComboBox,它绑定到 C# ViewModel 类中 Department 对象的 ObservableCollection。我想使用组合框按部门过滤另一个集合(现在确实适用)问题是我想在列表顶部添加一个附加选项“全部”。有没有正确的方法来做到这一点。让一个假部门感觉在很多方面都是错误的。

组合框

<ComboBox ItemsSource="Binding Path=Departments" 
          SelectedValue="Binding Path=DepartmentToShow , Mode=TwoWay" />

【问题讨论】:

【参考方案1】:

您可以使用 CompositeCollection 作为 ComboBox 的 ItemsSource 以包含“全部”选项。您需要将 CollectionContainer 的 Collection 属性设置为“部门对象的 ObservableCollection”。

<ComboBox >
    <ComboBox.ItemsSource>
        <CompositeCollection>
            <ComboBoxItem>All</ComboBoxItem>
            <CollectionContainer x:Name="departmentCollection"/>
        </CompositeCollection>
    </ComboBox.ItemsSource>
</ComboBox>

不确定这是否适合您的过滤情况...

【讨论】:

+1 哇,作为一名经验丰富的 WPF 程序员,我什至不知道CompositeCollection!搜索互联网时有各种解决方法,但没有提到这一点!难以置信... 是的,当我读到这篇文章时,我很惊讶。今天早上我一直在做一些调查,我认为它会成功。现在过滤是在构建 Linq 查询时完成的,所以我想我可以测试“全部”,如果没有选择,则迭代 peopleCollection。将来我计划重构并使用 CollectionViewSource 过滤视图而无需重新查询;我不确定这将如何工作,但对于这个问题,我有我的答案。谢谢! @Aviad 是的,这是一个不错的解决方案,但确实有点糟糕的是,您不能通过 DataContext 绑定到 Collection 属性,因为 CompositeCollection 不是 Freezable。这可以通过绑定到静态资源来解决... 这个问题的解决方案有一个例子说明如何以这种方式绑定***.com/questions/1189052/… 不是特别漂亮的IMO,但可以解决问题...... 以这种方式添加 ComboBoxitem 会引发 Horizo​​ntalContentAlignment 和 VerticalContentAlignment 绑定错误。有人对此有解决方案吗?【参考方案2】:

假设您有一个名为 MyCombo 的 ComboBox,一个名为 MyEntity 的实体与名为 MyDomainService 的 DomaineService 相关联。

别忘了

using System.ServiceModel.DomainServices.Client;

当然还有与您的实体和 DomainService 的网站一起使用效果很好

你调用了一个名为 :

void LoadEntities()

    MyDomainService_Context = new MyDomainService();
    EntityQuery<MyEntity > mQuery = null;

    mQuery = from q in _Context.GetMyDomainServiceQuery()
             select q;

    LoadOperation<MyEntity > loadOpLoadEntities = _Context.Load(mQuery, LoadOpLoadEntitiesCallBack, null);

然后在CallBack函数中:

void LoadOpLoadEntitiesCallBack(LoadOperation<MyEntity> loadOperation)

    if (loadOperation.Entities.Count() > 0)
    
        List<MyEntity> mList = new List<MyEntity>();
        MyEntity mE = new MyEntity();
        mE.Column1 = -1;
        mE.Column2 = "Default value";
        mList.Add(mE);

        for (int i = 0; i < loadOperation.Entities.Count(); i++)
        
            mList.Add(loadOperation.Entities.ToList()[i]);
        

        this.MyCombo.ItemsSource = mList.ToList();
    

【讨论】:

这是一个使用 Linq to SQL 的 MVVM WPF 应用程序。 Composite COllection 解决方案几年来一直运行良好,但感谢您的额外投入。

以上是关于如何将通用项目添加到绑定到 WPF 中的集合的 ComboBox的主要内容,如果未能解决你的问题,请参考以下文章

将按钮绑定到 DataGrid WPF 中的对象

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

如何将 DataGrid 中的文本框绑定到 Wpf 中的列表?

WPF绑定到集合

WPF 将枚举列表(或类似列表)绑定到复选框列表

WPF将单个文本框绑定到集合对象或数组中的元素