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

16

我在一个 WPF 应用程序中有一个 ComboBox,它绑定到 C# ViewModel 类中的一个 ObservableCollection 部门对象。我想使用组合框通过部门来筛选另一个集合(现在它确实可以工作)。问题在于我想在列表顶部添加一个额外选项“全部”。是否有正确的方法来实现这一点?创建一个虚假部门在很多方面都感觉不对。

ComboBox

<ComboBox ItemsSource="{Binding Path=Departments}" 
          SelectedValue="{Binding Path=DepartmentToShow , Mode=TwoWay}" />
2个回答

23

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

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

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


1
作为一名有经验的 WPF 程序员,我甚至不知道 CompositeCollection 的存在!在网络上搜索时有各种解决方法可供选择,但没有一个提到了这个。太神奇了... - Aviad P.
是的,当我读到这个问题时感到很惊讶。今天早上我进行了一些调查,我认为它会起作用。目前过滤是在构建Linq查询时完成的,因此我认为我可以测试“全部”,如果没有选择,则迭代peopleCollection。将来我计划重构并使用CollectionViewSource来过滤视图而无需重新查询;我不确定这该怎么做,但对于这个问题,我已经有了答案。谢谢! - Mike B
1
@Aviad 是的,这是一个不错的解决方案,但有一件事有点糟糕,就是你不能通过DataContext绑定到Collection属性,因为CompositeCollection不是Freezable。可以通过绑定到静态资源来解决这个问题... - Simon Fox
2
这个问题的解决方案有一个绑定方式的示例,https://dev59.com/23M_5IYBdhLWcg3w3nXz 我认为不是特别漂亮,但可以解决问题... - Simon Fox
以这种方式添加ComboBoxitem会引发HorizontalContentAlignment和VerticalContentAlignment绑定错误。有没有人有解决方案? - Julien

0
假设您有一个名为MyCombo的组合框,一个与名为MyDomainService的域服务相关联的实体MyEntity

不要忘记

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应用程序。复合集合解决方案已经运行了几年,但感谢额外的输入。 - Mike B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接