绑定在windows phone 8的非常有用的可见列表筛选-collectionviewsource


[原文发表地址]:  CollectionViewSource is crazy useful for binding to filtered Observable Collections on Windows Phone 8

[原文发表时间]:  2013-10-21

 

       我一直在研究windows phone 8应用程序(它是一个消息应用程序,但是记住我的话,她将会非常巨大)。

       最初开发时,我将一个Pivot控件绑定到”FeedItem”类型的基础可见列表上面。所以基本上我的XAML是这样写的。

       这里你需要 关注的是第一行的 ItemsSource=””:

<phone:Pivot Title="MAGICAL FREAKING NEWS" x:Name="MainPivot"
ItemsSource="{Binding Path=NewsData.Feeds}" >
<phone:Pivot.HeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=key}"/>
</DataTemplate>
</phone:Pivot.HeaderTemplate>

<phone:Pivot.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="0">
<TextBlock Text="{Binding Path=title}" Style="{StaticResource PhoneTextTitle2Style}" HorizontalAlignment="Center"/>
<TextBlock Text="{Binding Path=updated_at, StringFormat=F}" HorizontalAlignment="Center" TextWrapping="Wrap" />
<Button x:Name="PlayButton" Margin="0,40,0,0" HorizontalAlignment="Center" Style="{StaticResource PlayStyle}" Click="Play_Click">
<Button.RenderTransform>
<!-- Changes to .5 when in Landscape -->
<ScaleTransform x:Name="OrientationScale" ScaleX="1" ScaleY="1" CenterX="60" CenterY="0"/>
</Button.RenderTransform>
</Button>
</StackPanel>

...snip...you get the idea.



       我很喜欢设计时数据的想法,也就是说我可以在Visual Studio中设计我的页面并且我的应用程序像是使用了产生在设计时的静态数据。这点我只是在PhoneApplicationPage级别上做了增加。

d:DataContext="{d:DesignData Content/NewsDataSample.xaml}"

       并且XAML的示例文件像是一个”XAML-shaped”对象模型版本,它实际上是在运行时被JSON解释加载。

<vm:AppViewModel
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:toawesometolive_portable.Data;assembly=icantstandit-portable"
OperationInProgress="True"
>
<vm:AppViewModel.NewsData Force="False">
<vm:NewsData>
<vm:NewsData.Feeds>
<vm:Feed id="0" key="NPR" subtitle="National Public Radio"
...snip...

       不久之后,一些部分和需求就会改变, 现在我需要能够单独使新的资源可用或不可用,并且在运行的时候重新整顿这些资源。

image

       如果资源不可用,这个资源页面将不在首页的Pivot里面显示,资源页面和主要的Pivot控件都要绑定到同一个可见列表上,除此之外我需要一个可以选择各种可用的Pivot的过滤器。

       我尝试了很多东西,如别的子列表,返回过滤列表的属性,派生这个或那个,最终我发现了(没有很详细的文档记录)CollectionViewSource。

       原来WPF已使用CollectionViewSource有多年。这里有Beth Massi在2008年关于CollectionViewSource的讨论,我有点崩溃(在5年后的手机上我才发现它)。

       你可以在你的页面上使用多个CollectionViewSource。还可以在主要的表单上使用它们,我感兴趣的是路径和过滤。你绑定任何控件到同一个CollectionViewSource上,它们都会有相同的当前项。

       我把它放到我的手机页面的代码上,如:

<phone:PhoneApplicationPage.Resources>
<CollectionViewSource x:Key="src" Source="{Binding Path=NewsData.Feeds}"/>
</phone:PhoneApplicationPage.Resources>
        
然后用名字绑定到CollectionViewSource上:

ItemsSource="{Binding Source={StaticResource src}}"

       我知道人们喜欢在XAML上做任何事情,但是那并不是我的做法(而对于我正在做的我也没有其他的想法)。

       在我的页面代码后面,我设置了一个过滤条件:

collectionView.Source = App.ViewModel.NewsData.Feeds;
collectionView.View.Filter = item =>
{
Feed f = item as Feed;
if (f == null) return false;
if (!f.enabled) return false;
return true;
};

       就是这样。 现在我可以启用和禁用资源视图的项目,并且通过只显示已启用的资源,Pivot能够很好地更新。

       理想情况下我能在xaml中使用where子句作为一个属性,这一方法确实工作的很好。我觉得其实collectionviewsource有很多更深层的东西,但我会在我的应用程序的其他部分最终使用到它。


Comments (0)

Skip to main content