【问题标题】:How to get the first element of a CollectionViewSource?如何获取 CollectionViewSource 的第一个元素?
【发布时间】:2012-06-22 01:12:55
【问题描述】:

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

这是我来自资源的 CollectionViewSource。

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

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

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

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

【问题讨论】:

    标签: c# wpf silverlight xaml microsoft-metro


    【解决方案1】:

    如上一课所述,您应该使用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;
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案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;
            }
        }
        

        然后从 observable 集合中调用它:

        var firstItem = observable.First();
        

        【讨论】:

        • 要获得集合的第一个可见元素(不是基础数据),这是恕我直言的方法。尽管如果您使用扩展方法,我会将其命名为 FirstInView 或类似名称以明确我们正在访问集合视图而不是(可观察的)集合本身。
        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2014-09-08
          • 1970-01-01
          • 2012-05-08
          • 2011-05-04
          • 1970-01-01
          • 1970-01-01
          • 2022-08-17
          • 1970-01-01
          • 2022-06-14
          相关资源
          最近更新 更多