CollectionViewSource CurrentItem

10

我在对话框视图模型中使用了CollectionViewSource来实现不同的过滤需求,它运行良好。我还维护了一个属性(SelectedProject),相当于选定的项目,我在想是否可以/应该去除它,因为视图会知道当前项。我的数据绑定看起来像这样:

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

我使用SelectedProject的setter方法来方便单元测试,据我所见,CurrentItem似乎不能设置。当我想要使用它时,我还需要将其转换为正确的对象。 另一方面,如果 SelectedProject是多余的,那么我会像处理其他任何多余内容一样删除它。

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

3个回答

7

您可以不使用SelectedProject,但我不建议这样做。如果您在代码中使用该属性,那么您的意图就很明显。如果不使用它,您需要进行以下操作:

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

只是与当前项目交互而已。我更注重清晰明了,不追求“内置”。此外,CurrentItem是只读的,因此如果您想在ViewModel中选择一个项目,这是不可能的。


1
你可以使用各种移动方法来设置当前项,但我认为可读性值得争议的冗余。干杯 - Berryl
6
最后一点是错误的。CollectionView.MoveCurrentTo(object item) 方法可以让你在视图模型中更新选择项。 - Gusdor

1
在我的情况下,我试图设置一个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中包含的item引用不同,所以我必须像这样解决它。

1

你需要明白,ListView的SelectedItem是独立于ItemsSource的。无论你使用CollectionViewSource、List还是Array,所选项目始终代表该集合中的项目。

因此,为什么你的SelectedProject没有设置,我建议你检查你的setter功能是否存在错误。在调试期间,在Output中查找任何绑定错误消息可以找出绑定是否包含错误的好方法。

注意:如果你的SelectedProject与Projects CollectionViewSource中的项相同,则使用之前不需要将其强制转换(除非你将SelectedProject设为Object类型,这也解释了你的设置问题)。

编辑:对不起,简短的答案是否定的,它并不多余。如果你考虑测试,那么将变量绑定到当前项目就不是多余的了。一个很好的例子是当你想测试旧版本的SelectedItem和新版本时。现在,如果你只参考CollectionViewSource的SelectedItem,那么比较可能会太晚了,但是有了你自己的变量,你可以在再次设置之前测试逻辑。


选择的项目运行良好 - 问题是CollectionViewSource CurrentItem是否冗余。 - Berryl

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