C# 筛选ListBox.ItemsSource中的复选框
我对Windows Phone编程非常陌生,在编辑列表框中的数据时遇到问题。C# 筛选ListBox.ItemsSource中的复选框,c#,xml,windows-phone-7,listbox,C#,Xml,Windows Phone 7,Listbox,我对Windows Phone编程非常陌生,在编辑列表框中的数据时遇到问题。 我正在将XML文件中的数据加载到列表中,并在列表框中显示它们。 我的XML中的每个条目都附加了一个类型。我想通过选中/取消选中某些复选框来删除/添加具有特定类型的条目 我发现了这样的东西: 但它并不完全适合我的需要,因为我只想删除部分列表框项目,然后可能只需再次选中复选框即可将其取回。 另外,我不想手动添加每个条目,因为我已经用包含XML条目的列表绑定了listbox 我上传XML的方式如下: Activity.cs
我正在将XML文件中的数据加载到列表中,并在列表框中显示它们。
我的XML中的每个条目都附加了一个类型。我想通过选中/取消选中某些复选框来删除/添加具有特定类型的条目 我发现了这样的东西:
但它并不完全适合我的需要,因为我只想删除部分列表框项目,然后可能只需再次选中复选框即可将其取回。
另外,我不想手动添加每个条目,因为我已经用包含XML条目的列表绑定了listbox 我上传XML的方式如下:
Activity.cs
:
namespace ReadXMLfromFile
{
public class Activity
{
public string Type { get; private set; }
public string Description { get; private set; }
public Activity(string type, string description)
{
Type = type;
Description = description;
}
public static List<Activity> LoadActivities(XDocument doc)
{
return doc .Root
.Elements("Activity")
.Select(el => new Activity((string)el.Attribute("Type"),
el.Value))
.ToList();
}
public static List<Activity> LoadActivities()
{
using (var store = IsolatedStorageFile.GetUserStoreForApplication())
{
if (store.FileExists("Activities.xml"))
{
using (var stream = store.OpenFile("Activities.xml",
FileMode.Open))
{
return LoadActivities(XDocument.Load(stream));
}
}
}
// No user file... load the default activities
return LoadActivities(XDocument.Load("Assets/Activities.xml"));
}
}
}
名称空间ReadXMLfromFile
{
公共课堂活动
{
公共字符串类型{get;private set;}
公共字符串说明{get;private set;}
公共活动(字符串类型、字符串描述)
{
类型=类型;
描述=描述;
}
公共静态列表加载活动(XDocument文档)
{
返回单据根
.要素(“活动”)
.Select(el=>newactivity((string)el.Attribute(“Type”),
el.价值)
.ToList();
}
公共静态列表加载活动()
{
使用(var store=IsolatedStorageFile.GetUserStoreForApplication())
{
if(store.FileExists(“Activities.xml”))
{
使用(var stream=store.OpenFile(“Activities.xml”),
FileMode.Open)
{
返回LoadActivities(XDocument.Load(stream));
}
}
}
//没有用户文件…加载默认活动
返回LoadActivities(XDocument.Load(“Assets/Activities.xml”);
}
}
}
以下是我的页面代码:
namespace ActivityManager
{
public partial class PivotPage1 : PhoneApplicationPage
{
private List<Activity> activities;
public void ActivityDisplay()
{
activities = Activity.LoadActivities();
listBox1.ItemsSource = activities;
}
public PivotPage1()
{
InitializeComponent();
ActivityDisplay();
}
private void CookingCheck_Checked(object sender, RoutedEventArgs e)
{
}
private void ArtCheck_Checked(object sender, RoutedEventArgs e)
{
}
private void LanguageCheck_Checked(object sender, RoutedEventArgs e)
{
}
private void ScienceCheck_Checked(object sender, RoutedEventArgs e)
{
}
private void SportCheck_Checked(object sender, RoutedEventArgs e)
{
}
命名空间活动管理器
{
公共部分类PivotPage1:PhoneApplicationPage
{
私人名单活动;
公共作废活动显示()
{
activities=Activity.LoadActivities();
listBox1.ItemsSource=活动;
}
公共数据透视图第1页()
{
初始化组件();
ActivityDisplay();
}
私有无效CookingCheck\u已选中(对象发送器,路由目标e)
{
}
已选中私有无效艺术检查(对象发送者,路由目标e)
{
}
私有无效语言检查\u检查(对象发送方、路由目标)
{
}
私有无效科学检查(对象发送方,路由目标e)
{
}
已选中私有void SportCheck(对象发送器,路由目标e)
{
}
和列表框的xaml:
<ListBox Height="347" HorizontalAlignment="Left" Margin="27,243,0,0"
Name="listBox1" VerticalAlignment="Top" Width="410"
SelectionChanged="listBox1_SelectionChanged" AllowDrop="False"
ItemsSource="{Binding activities}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Margin="10">
<TextBlock Text="{Binding Activity}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
这里还有我的XML文件
<?xml version="1.0" encoding="utf-8" ?>
<Activities>
<Activity Type="Cooking">
Cook some Mexican food
</Activity>
<Activity Type="Art">
Draw a picture
</Activity>
<Activity Type="Language">
Learn 5 words in Polish you didn't know yet
</Activity>
<Activity Type="Science">
Write a simple program in C
</Activity>
<Activity Type="Sport">
Go to the gym
</Activity>
</Activities>
做些墨西哥菜
画画
学习5个你还不知道的波兰语单词
用C编写一个简单的程序
去健身房
你能帮我吗?我很困,可能错过了一些明显的东西。提前谢谢你。你应该这样做:
创建筛选器列表。
选中/取消选中复选框时更新筛选器列表,每次更改筛选器时更新列表
private List<Activity> activities;
public void ActivityDisplay()
{
activities = Activity.LoadActivities();
FilterActivities();
}
public ObservableCollection<string> ActivityFilter = new ObservableCollection<string>();
private void FilterActivities()
{
listbox1.ItemsSource = null; //sometimes it makes the difference;
listBox1.ItemsSource = activities.Where(activity => ActivityFilter.Any(filter => filter == activity.Type) || ActivityFilter.Count == 0);
}
public PivotPage1()
{
InitializeComponent();
ActivityFilter.CollectionChanged += ActivityFilter_CollectionChanged;
ActivityDisplay();
}
void ActivityFilter_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
FilterActivities();
}
private void CookingCheck_Checked(object sender, RoutedEventArgs e)
{
ActivityFilter.Add("Cooking");
}
private void CookingCheck_Unchecked(object sender, RoutedEventArgs e)
{
ActivityFilter.Remove("Cooking");
}
//Repeat the procedure for each checkbox
私人列表活动;
公共作废活动显示()
{
activities=Activity.LoadActivities();
过滤活性();
}
公共ObservableCollection ActivityFilter=新的ObservableCollection();
专用空过滤器活动()
{
listbox1.ItemsSource=null;//有时它会起作用;
listBox1.ItemsSource=activities.Where(activity=>ActivityFilter.Any(filter=>filter==activity.Type)| | ActivityFilter.Count==0);
}
公共数据透视图第1页()
{
初始化组件();
ActivityFilter.CollectionChanged+=ActivityFilter\u CollectionChanged;
ActivityDisplay();
}
void ActivityFilter\u CollectionChanged(对象发送方,System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
过滤活性();
}
私有无效CookingCheck\u已选中(对象发送器,路由目标e)
{
ActivityFilter.添加(“烹饪”);
}
私有无效CookingCheck\u未选中(对象发送方,路由目标)
{
活动过滤器。移除(“烹饪”);
}
//对每个复选框重复此过程
我在你的ItemTemplate中发现了一个问题使用这个
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Margin="10">
<TextBlock Text="{Binding Description}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
您好。我尝试使用您的代码并重复了该过程,但不幸的是,它似乎不起作用。这是完整的吗?还是有其他方法需要刷新列表框才能正确显示?因为到目前为止,无论我选中/取消选中什么,列表框似乎都不会受到影响。遗憾的是,它没有解决问题。但是r再次查看代码时,我注意到您在示例中删除了public void ActivityDisplay
中的listBox1.itemsource=activities;
。当我这样做时,活动列表根本没有加载。是否有可能listBox1.itemsource=activities有问题。在哪里(activity=>ActivityFilter.Any(filter=>filter==activity.Type)| | ActivityFilter.Count==0)
?@Tajgun92我一开始忘了绑定它,现在它又绑定正确了,但遗憾的是,这个问题在我这方面没有得到解决。对于listbox,复选框仍然不起作用。更改ItemTemplate所做的只是从listbox中删除类型,只留下描述。请在选中的事件和FilterActivity之后放置一个断点偶然检查ItemsSource不为null并且在中包含对象it@verdesrobert在检查事件期间,源为空。发生FilterActivity后,有