首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CollectionViewSource CurrentItem

CollectionViewSource CurrentItem
EN

Stack Overflow用户
提问于 2010-02-27 19:04:12
回答 3查看 13.2K关注 0票数 10

我在对话框视图模型中使用CollectionViewSource,该模型具有各种过滤要求,工作正常。我还在属性(SelectedProject)中维护了所选项的等效值,并且我想知道是否可以/应该取消它,因为视图将知道当前项。我的数据绑定看起来如下:

代码语言:javascript
复制
<ListView  
      ItemsSource="{Binding Projects.View}" 
      IsSynchronizedWithCurrentItem="True"
      SelectedItem="{Binding SelectedProject, Mode=TwoWay}">

我使用SelectedProject的设置器来促进单元测试,据我所见,CurrentItem似乎是不可设置的。当我想要使用它时,我还需要将它转换成正确的对象。OTOH,如果SelectedProject是冗余的,那么我会向它展示与任何其他冗余相同的方面,并删除它。

因此,在使用CollectionViewSource时,通常如何处理当前项?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-02-28 15:03:44

你可以废除SelectedProject,但我会反对它。如果您的代码中有该属性,则很清楚您在做什么。如果你没有它,你就需要做如下的事情

代码语言:javascript
复制
CollectionViewSource.GetDefaultView(Projects.View).CurrentItem as Project

只是为了与当前项目进行交互。我比“内置”更看重清晰。最重要的是,CurrentItem是只读的,所以如果您想要在ViewModel中选择一个项目,这是不可能的。

票数 7
EN

Stack Overflow用户

发布于 2010-02-28 05:38:02

您需要理解来自ListView的ListView是独立于ItemsSource的。无论您使用的是CollectionViewSource、列表还是数组,所选的项都将始终表示该集合的项。

因此,要回答您的问题,为什么您的SelectedProject没有设置,我建议您检查您的设置器功能的错误。查找绑定是否包含任何错误的一个好方法是在调试期间检查我们的输出中是否存在任何绑定错误消息。

注意:如果您的SelectedProject与项目CollectionViewSource中的项类型相同,那么您不必在使用之前转换它(除非您已经创建了对象类型的SelectedProject,这也解释了您的设置问题)。

编辑:对不起,简短的回答是不,它不是多余的。如果考虑到测试,那么将变量绑定到当前项并不是多余的。一个很好的例子是当您想要用新的测试旧版本的SelectedItem时。现在,如果您只引用CollectionViewSourceSelectedItem,那么进行比较可能为时已晚,但是使用您自己的变量,您可以在再次设置它之前对逻辑进行测试。

票数 1
EN

Stack Overflow用户

发布于 2013-09-18 21:43:48

在我的例子中,我试图将SelectedItem设置为ItemsSource绑定到CollectionViewSource的ListBox。这很麻烦,因为您确实需要在CollectionViewSource上设置当前项,而不是为我创建一个扩展方法来处理这个场景:

代码语言:javascript
复制
YourListBox.SetCurrentItemOnView<YourObjectType>(item);

...and扩展方法定义

代码语言:javascript
复制
public static void SetCurrentItemOnView<T>(this System.Windows.Controls.ListBox listBox, T item) where T : YourObjectType
{
    var view = listBox.ItemsSource as ListCollectionView;
    if (view == null) { return; }

    var itemToSelect = (from p in view.SourceCollection.OfType<T>()
                        where p.ID == item.ID
                        select p).FirstOrDefault();

    view.MoveCurrentTo(itemToSelect);
}

我猜这对我来说是个问题,因为在我的例子中,我拥有的项引用与ItemsSource中包含的项引用不一样,所以我不得不这样解决它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2348545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档