【问题标题】:CollectionViewSource CurrentItemCollectionViewSource 当前项
【发布时间】:2010-02-27 19:04:12
【问题描述】:

我在具有各种过滤要求的对话框视图模型中使用 CollectionViewSource,效果很好。我还在属性(SelectedProject)中维护了选定项的等效项,我想知道我是否可以/应该取消它,因为视图会知道当前项。我的数据绑定如下:

<ListView  
      ItemsSource="{Binding Projects.View}" 
      IsSynchronizedWithCurrentItem="True"
      SelectedItem="{Binding SelectedProject, Mode=TwoWay}">

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

那么,当您使用 CollectionViewSource 时,您通常如何处理当前项目?

【问题讨论】:

    标签: .net wpf data-binding collectionviewsource


    【解决方案1】:

    可以取消 SelectedProject,但我会反对它。如果您的代码中有该属性,那么您在做什么就很清楚了。如果你没有它,你将需要做类似的事情

    CollectionViewSource.GetDefaultView(Projects.View).CurrentItem as Project
    

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

    【讨论】:

    • 您可以使用各种移动方法设置当前项目,但我同意可读性值得有争议的冗余。干杯
    • 最后一点不正确。 CollectionView.MoveCurrentTo(object item) 将允许您更新视图模型中的选择。
    【解决方案2】:

    您需要了解 ListView 中的 SelectedItem 是独立于 ItemsSource 的。无论您使用 CollectionViewSource 还是 List 或 Array,所选项目将始终代表该集合的项目。

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

    注意:如果您的 SelectedProject 与您的 Projects CollectionViewSource 中的项目类型相同,那么您无需在使用前强制转换它(除非您已将 SelectedProject 设为 Object 类型,这也说明了您的设置问题)。

    编辑:对不起,简短的回答是否定的,它不是多余的。如果您考虑到测试,将变量绑定到当前项目并不是多余的。一个很好的例子是当您想用新版本测试旧版本的SelectedItem。现在如果你只参考CollectionViewSourceSelectedItem,那么比较可能来不及了,但是用你自己的变量,你可以在重新设置之前测试逻辑。

    【讨论】:

    • SelectedProject 完美运行 - 问题是它是否对 ColloctionViewSource CurrentItem 是多余的。
    【解决方案3】:

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

    YourListBox.SetCurrentItemOnView<YourObjectType>(item);
    

    ...以及扩展方法定义

    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);
    }
    

    我猜这对我来说是个问题,因为在我的情况下,我拥有的 item 引用与 ItemsSource 中包含的项目引用不同,所以我必须像这样解决它.

    【讨论】:

      猜你喜欢
      • 2018-07-21
      • 1970-01-01
      • 2011-05-03
      • 1970-01-01
      • 1970-01-01
      • 2011-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多