Windows Metro App过滤Listview并显示列表中的特定数据?

时间:2012-07-25 04:03:21

标签: windows windows-8

我不知道Listview创建是否有任何“回调”,以便我可以从列表中显示非常具体的数据类型。 我所知道的是,只有完整列表可以绑定到ListView,但是如何在iOS中通过Datasource Delegate帮助完成一些检查。

任何人?

2 个答案:

答案 0 :(得分:2)

传统上,使用 CollectionViewSource 进行过滤和分组。很遗憾, CollectionViewSource 不再具有过滤器事件或 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的一部分。 属性返回的值将是LINQ查询的结果。这让我很困惑,因为我不知道该属性应该返回什么 type 。我选择了一系列可比较的项目。这几乎适用于任何类型的任何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;

希望有所帮助!

答案 1 :(得分:1)

我不是100%确定您尝试解决的确切方案,但有一些方法可以在现有数据源上创建过滤视图。您也不会说这是XAML还是JavaScript。我要回答JavaScript部分。

显然,你可以将你所拥有的数据重新包装到你想要的表格中。

您还可以选择其他一些选项:

  • 使用WinJS.Binding.List以及createFilter方法。参见:

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