我记得看过一些代码xaml,可以从集合中获取第一个元素(如索引x [0])。
这是我的资源中的CollectionViewSource。
<CollectionViewSource
x:Name="groupedItemsViewSource2"
Source="{Binding Posters}"
ItemsPath="Posters" />
如果我在列表框中显示它,它会加载它!
<ListBox ItemsSource="{Binding Source={StaticResource groupedItemsViewSource2}}" />
但是现在,我只想通过xaml获得第一个元素。有可能这样做吗?
答案 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;
}
}
}