CollectionViewSource CurrentItem

时间:2010-02-27 19:04:13

标签: .net wpf data-binding collectionviewsource

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

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

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

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

3 个答案:

答案 0 :(得分:7)

可以取消选定项目,但我会反对它。如果您的代码中包含该属性,则表明您正在执行的操作。如果你没有它,你需要做类似的事情

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

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

答案 1 :(得分:1)

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

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

注意:如果您的SelectedProject与Projects CollectionViewSource中的项目类型相同,那么您不需要在使用之前将其强制转换(除非您已经创建了Object类型的SelectedProject,这也解释了您的设置问题)。

编辑:抱歉,简短的回答是否定的,这不是多余的。如果您考虑到测试,那么将变量绑定到当前项并不是多余的。一个很好的例子是当你想用新的SelectedItem测试旧版本时。现在,如果你只引用CollectionViewSource的{​​{1}},那么比较可能为时已晚,但是对于你自己的变量,你可以在再次设置之前测试逻辑。

答案 2 :(得分:1)

就我而言,我试图在ListBox上设置SelectedItem,而ItemsSource绑定到CollectionViewSource。它很乱,因为你真的需要在CollectionViewSource上设置当前项而不是ListBox.SelectedItem ....所以我创建了一个Extension方法来为我处理这个场景:

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

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

相关问题