[英]Filtering bound XML data in WPF
基本上,我有一個WPF應用程序,它將在列表框中向用戶顯示公告。 填充列表框的信息來自XML文件,該文件包含有關不同公告的詳細信息。 然后,我將應用一個數據模板來顯示相關信息。 我在應用程序底部有兩個按鈕,我想要的是當用戶單擊未讀公告按鈕時,數據被篩選為僅在列表框中顯示未讀公告。 然后,當用戶單擊“所有公告”時,我希望再次顯示所有公告。 無論單擊哪個按鈕,我使用的數據模板都將保持不變。
在正在使用的XML文件中,有一個稱為read的字段,其中0表示尚未讀取,而1表示已讀取,應使用此字段進行過濾。
因此,實際上我只是在尋找過濾示例或任何不錯的教程,因此我可以取得一些進步。 如果您需要我的任何代碼,請告訴我,然后將其粘貼。
編輯
現在在下面添加了代碼,以顯示如何綁定數據以及數據的布局:
<XmlDataProvider
x:Key="Article"
Source="/Data/People.xml"
XPath="People/article"/>
<DataTemplate x:Key="AnnouncementTemplate">
<Border Background="#2200FF00"
BorderBrush="Black"
BorderThickness="1"
CornerRadius="8"
Margin="2,4,2,4"
Padding="2"
>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="220"/>
</Grid.ColumnDefinitions>
<Border Background="#2200FF00"
BorderBrush="Black"
BorderThickness="1"
CornerRadius="8"
Margin="2,4,2,4"
Padding="2"
>
<StackPanel Grid.Column="0">
<Image Stretch="Fill" Width="20" Source="Images/BlueOrb.ico" Height="20" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</StackPanel>
</Border>
<StackPanel Grid.Column="1" Margin="5">
<StackPanel Orientation="Horizontal">
<TextBlock FontWeight="Bold" Text="{Binding XPath=./author}" />
<TextBlock Text=" "/>
<TextBlock Text="{Binding XPath=./datetime}" TextTrimming="WordEllipsis"/>
</StackPanel>
<StackPanel>
<TextBlock FontWeight="Bold" Text="{Binding XPath=./title}"/>
</StackPanel>
<StackPanel>
<TextBlock Text="{Binding XPath=./body}" TextTrimming="WordEllipsis"/>
</StackPanel>
</StackPanel>
</Grid>
</Border>
</DataTemplate>
<ListBox Style="{StaticResource SpecialListStyle}"
Name="listBox1"
Margin="10,10,10,10"
Grid.Row="1"
ItemsSource="{Binding Source={StaticResource Article}}"
IsSynchronizedWithCurrentItem="True"
ItemContainerStyle="{StaticResource SpecialListItem}"
ItemTemplate="{StaticResource AnnouncementTemplate}"/>
XML文件中保存的數據示例,該數據要過濾,因此僅顯示其中read == 0的消息
<People>
<article>
<author>Michael</author>
<title>Happy Christmas</title>
<body>Merry Christmas one and all</body>
<priority>1</priority>
<uid>G-0617-8567-EF32-hello</uid>
<audience>0</audience>
<read>0</read>
<datetime>December 31, 2009 23:59:59</datetime>
</article>
<article>
<author>Gary</author>
<title>Landesk</title>
<body>Landesk Distributed</body>
<priority>0</priority>
<uid>G-0618-8567-EF32-hello</uid>
<audience>0</audience>
<read>1</read>
<datetime>December 31, 2009 23:59:59</datetime>
</article>
</People>
當您將數據綁定到列表框或任何類似控件時,WPF會將其與CollectionViewSource實例包裝在一起。
因此,假設您的數據源名為myItems。 然后,您可以按以下方式獲取此實例:
ICollectionViewSource viewSource = CollectionViewSource.GetDefaultView(myItems);
ICollectionViewSource具有一個Filter
屬性,可用於過濾項目。 您還可以使用ICollectionViewSource.Refresh()強制視覺控件刷新其內容。
現在,我已經可以使用以下代碼來解決此問題,該代碼還涉及將XML文件的讀取節點變成article元素的屬性:
ICollectionView RefineList()
{
DataSourceProvider provider = (DataSourceProvider)this.FindResource("Article");
return CollectionViewSource.GetDefaultView(provider.Data);
}
private void Unread_Click(object sender, RoutedEventArgs e)
{
ICollectionView view = RefineList();
if (view.Filter == null)
{
view.Filter = delegate(object item)
{
return
int.Parse(((XmlElement)item).Attributes["read"].Value) == 0;
};
}
else
{
view.Filter = null;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.