如何获取CollectionViewSource的第一个元素?

3

我记得在一些xaml代码中看到过可以从集合中获取第一个元素(类似于索引 x[0])的代码。

这是我的资源中的CollectionViewSource。

<CollectionViewSource
            x:Name="groupedItemsViewSource2"
            Source="{Binding Posters}"
            ItemsPath="Posters" />

如果我将它显示在列表框中,它就被加载了!
<ListBox ItemsSource="{Binding Source={StaticResource groupedItemsViewSource2}}" />

但是现在,我只想通过 XAML 获取第一个元素。这可行吗?

4个回答

9
我遇到了类似的问题,我的解决方法是在ViewModel中调用MoveCurrentToFirst方法。
另一个方法是在XAML中使用SelectedIndex=0(对于ListBox),但当CollectionViewSource没有任何数据时,该方法会失败。

4
到目前为止,我找到的最简单的方法是通过枚举器(enumerator)进行。
ICollectionView view = CollectionViewSource.GetDefaultView(observable);
var enumerator = view.GetEnumerator();
enumerator.MoveNext(); // sets it to the first element
var firstElement = enumerator.Current;

或者您可以使用扩展方法并将其直接调用到可观察集合中:
public static class Extensions
{
    public static T First<T>(this ObservableCollection<T> observableCollection)
    {
        ICollectionView view = CollectionViewSource.GetDefaultView(observableCollection);
        var enumerator = view.GetEnumerator();
        enumerator.MoveNext();
        T firstElement = (T)enumerator.Current;
        return firstElement;
    }
}

然后从可观察集合中调用它:

var firstItem = observable.First();

1
获取集合中第一个可见元素(而不是底层数据)的方法是这样的,我认为。虽然如果您使用扩展方法,我会将其命名为FirstInView或类似的名称,以明确我们正在访问集合视图而不是(可观察的)集合本身。 - ZoolWay

0

我知道有几种实现这个的方法。我可能会选择一个返回集合中第一个元素的单独属性,或者创建一个转换器,在绑定到任何集合或列表时都返回第一个元素。


0

如前面所述,您应该使用 ICollectionView 实例。您可以通过调用以下方法来获取一个:

ICollectionView view = CollectionViewSource.GetDefaultView(observable);

并创建扩展方法(使用C#语言版本9.0):

using System.Diagnostics.CodeAnalysis;

namespace System.ComponentModel
{
    public static class ICollectionViewExtensions
    {
        public static bool TryGetFirstInView<T>(this ICollectionView self, [NotNullWhen(true)] out T? item)
        {
            var enumerator = self.GetEnumerator();
            if (enumerator.MoveNext() && enumerator.Current is T current)
            {
                item = current;
                return true;
            }
            
            item = default;
            return false;
        }
    }
}

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