C# 在WPF中过滤绑定的XML数据
基本上,我有一个WPF应用程序,它将在列表框中向用户显示公告。填充列表框的信息来自一个XML文件,该文件包含有关不同公告的详细信息。然后,我将应用一个数据模板来显示相关信息。我在应用程序底部有两个按钮,我想要的是当用户单击未读公告按钮时,数据被过滤,只在列表框中显示未读公告。然后,当用户单击所有公告时,我希望再次显示所有公告。无论单击哪个按钮,我使用的数据模板都将保持不变 在正在使用的XML文件中有一个名为read的字段,0表示尚未读取,1表示已读取,应使用该字段进行筛选 所以我真的只是在寻找过滤的例子或任何好的教程,所以我可以取得一些进展。如果您需要我的任何代码,请告诉我,我会将其粘贴进去 编辑 现在,在下面添加了代码,以显示如何绑定数据以及数据的布局:C# 在WPF中过滤绑定的XML数据,c#,wpf,data-binding,C#,Wpf,Data Binding,基本上,我有一个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>
迈克尔
圣诞快乐
圣诞快乐
1.
G-0617-8567-EF32-hello
0
0
2009年12月31日23:59:59
加里
兰德斯克
兰德斯克分布
0
G-0618-8567-EF32-hello
0
1.
2009年12月31日23:59:59
将数据绑定到listbox或任何类似控件时,WPF会使用CollectionViewSource实例对其进行包装
假设您的数据源命名为myItems。然后您可以按如下方式获得此实例:
ICollectionViewSource viewSource = CollectionViewSource.GetDefaultView(myItems);
ICollectionViewSource有一个
过滤器
属性,可用于过滤项目。您还可以使用ICollectionViewSource.refresh()强制visual control刷新其内容。我现在可以使用以下代码解决此问题,其中还包括将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;
}
}
半知半解总是有害的,所以请粘贴一些代码以便更好地输入。现在发布的内容非常真实,很抱歉由于假期的原因造成延迟。