0

我不知道 Listview 创建是否有任何“回调”,以便我可以显示我拥有的 List 中非常特定类型的数据。我所知道的是,只有完整列表可以绑定到 ListView,但是我怎样才能像在 iOS 中那样在 Datasource Delegate 的帮助下对其进行检查。

任何人 ?

4

2 回答 2

2

过滤和分组传统上是使用CollectionViewSource完成的。不幸的是,CollectionViewSource不再具有Filter事件或GroupDescriptions属性。似乎不支持过滤和分组,但两者仍然可以使用 LINQ 实现。

在您的 Xaml 中,在页面的资源部分添加一个CollectionViewSource 。确保 IsSourceGrouped 设置为 true:

<common:LayoutAwarePage.Resources>

    <!--
        Collection of grouped items displayed by this page, bound to a subset
        of the complete item list because items in groups cannot be virtualized
    -->
    <CollectionViewSource x:Name="GroupsCV" Source="{Binding Groups}" IsSourceGrouped="True" />

</common:LayoutAwarePage.Resources>

现在,CollectionViewSource (GroupsCV) 应该设置为您的 GridView 的 ItemsSource:

<GridView ItemsSource="{Binding Source={StaticResource GroupsCV}}" />

请注意,CollectionViewSource绑定到一个名为Groups的属性。此属性是我的 ViewModel 的一部分。Groups属性返回的值将是 LINQ 查询的结果。起初这让我很困惑,因为我不知道该属性应该返回什么类型。我选择了一组可比较的项目。这几乎适用于任何类型的任何 LINQ 查询。

因此,在您的 ViewModel(或任何您的 DataContext )中添加以下属性:

private IEnumerable<IGrouping<IComparable, TItem>> groups;
public IEnumerable<IGrouping<IComparable, TItem>> Groups
{
    get { return groups; }
    set { SetProperty(ref groups, value); }
}

现在,每当您想更改分组或过滤器时,只需将 Groups 属性设置为等于 LINQ 查询,如下所示:

Groups = from i in musicItems
            group i by i.Genre into g
            orderby g.Key
            select g;

LINQ 可以很好地处理已知的属性名称,但是让用户从属性名称列表中选择并按该属性动态分组呢?好吧,LYNQ 能够创建组的唯一要求是,无论您传递什么,它都必须实现IComparable

这是一个小扩展方法,它将属性名称作为字符串并返回IComparable

static public IComparable GetComparableValue<T>(this T item, string propName) where T : class
{
    return (IComparable)typeof(T).GetTypeInfo().GetDeclaredProperty(propName).GetValue(item, null);
}

有了它,您可以通过属性名称进行动态查询,如下所示:

string groupByPropertyName = "Artist";

Groups = from i in musicItems
group i by i.GetComparableValue(groupByPropertyName) into g
orderby g.Key
select g;

希望有帮助!

于 2012-07-30T20:53:42.583 回答
1

I'm not 100% sure of the exact scenario you're trying to solve, but there are ways to create a filtered view on an existing source of data. You also don't say if this is XAML or JavaScript. I'm gonna answer the JavaScript part.

Obviously, you could just re-wrap the data you've got to the form you want it.

You can also choose a number of other options:

  • Use WinJS.Binding.List, along with the createFilter method. See:

http://msdn.microsoft.com/en-us/library/windows/apps/Hh700774.aspx

http://msdn.microsoft.com/en-us/library/windows/apps/hh465496.aspx

http://msdn.microsoft.com/en-us/library/windows/apps/hh700741.aspx

http://msdn.microsoft.com/en-us/library/windows/apps/hh465464.aspx

于 2012-07-25T04:41:02.210 回答