3

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

这是我来自资源的 CollectionViewSource。

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

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

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

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

4

4 回答 4

9

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

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

于 2012-06-21T15:20:30.173 回答
4

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

ICollectionView view = CollectionViewSource.GetDefaultView(observable);
var enumerator = view.GetEnumerator();
enumerator.MoveNext(); // sets it to the first element
var firstElement = enumerator.Current;

或者你可以对一个扩展做同样的事情并直接在 observable 集合上调用它:

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();
于 2012-09-13T09:39:22.327 回答
0

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

于 2012-06-19T22:41:13.057 回答
0

如上一课所述,您应该使用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;
        }
    }
}
于 2021-08-11T10:40:31.500 回答