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

时间:2012-06-19 22:31:03

标签: c# wpf silverlight xaml microsoft-metro

我记得看过一些代码xaml,可以从集合中获取第一个元素(如索引x [0])。

这是我的资源中的CollectionViewSource。

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

如果我在列表框中显示它,它会加载它!

<ListBox ItemsSource="{Binding Source={StaticResource groupedItemsViewSource2}}" />

但是现在,我只想通过xaml获得第一个元素。有可能这样做吗?

4 个答案:

答案 0 :(得分:7)

我遇到了类似的问题,我做的是调用MoveCurrentToFirst(在ViewModel中)

`SelectedIndex = 0  (在XAML中的ListBox上),是另一种方式,但是当Collection视图源不包含任何数据时它失败了。

答案 1 :(得分:3)

到目前为止,我找到的最简单的方法是通过枚举器:

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

答案 2 :(得分:0)

我知道有几种方法可以实现这一目标。我可能会使用一个返回第一个集合的单独属性,或者创建一个Converter,它将返回它绑定的任何集合或列表中的第一个元素。

答案 3 :(得分:0)

如之前的 sesponse 所述,您应该使用 ICollectionView 实例。您可以拨打电话获取一份

ICollectionView view = CollectionViewSource.GetDefaultView(observable);

并创建扩展方法(使用c#langversion 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;
        }
    }
}