如何将通用项目添加到绑定到 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 会引发 HorizontalContentAlignment 和 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的主要内容,如果未能解决你的问题,请参考以下文章