【发布时间】:2011-09-01 00:10:12
【问题描述】:
在 Windows Phone 7 应用程序中嵌套 ListBox 的一个已知“问题”是,对于每个父类别,它们各自的子 ListBox 保留其自己的 SelectedItems 列表。好吧,我有一种情况,这是预期的行为,但我在捕获父列表框和子列表框选定列表时遇到问题。
当前功能: 1.列表项 2.列表项 3. 正在加载父子列表框数据 4. 父列表框项目的多选工作完美 5.子列表框项目的多选工作,但无法访问 6. UI 中可以为多个不同父项多选子 ListBox 项,但滚动大型列表集时选择丢失且无法访问 7. lstCategory 可以直接访问,但是 lstSubCategory 不能直接访问(可能,我就是不知道怎么弄) 8. 我绑定到一个带有一个复杂对象的 ViewModel,该对象将两个 ListBox 表示为两个 List 对象。
预期功能: 我希望能够同时选择 Category(父)和 SubCategory(子)ListBox 项,如下所示; (X) 表示选中:
- 面包 (X)
- 面包 (X)
- 羊角面包
- Buscuit (X)
- 甜甜圈
- 水果
- 菠萝 (X)
- 草莓
- 饮料 (X)
- 水
- 牛奶 (X)
- 果汁 (X)
- 苏打水
- 零食 (X)
- 筹码
- 薯条
- 线索混音
即使这是一个很长的列表,我也想保留这些选择。所以,我想要捕捉和使用的是:
- 面包(X)
- 面包 (X)
- Buscuit (X)
- 菠萝 (X)
- 饮料 (X)
- 牛奶 (X)
- 果汁 (X)
- 零食 (X)
由于我在每个项目的对象中都有一个 CategoryID,因此我可以在捕获时剥离层次结构信息。
为了简洁,这里是代码的精髓:
<ListBox
x:Name="lstCategory"
SelectionMode="Multiple"
ItemsSource="{Binding Categories}"
FontSize="32"
Margin="0,0,0,67">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding CategoryName}"
FontSize="36"
TextWrapping="Wrap"
Margin="20,0,0,0"
VerticalAlignment="Top"/>
<StackPanel Orientation="Vertical" Margin="60,0,0,0">
<ListBox
x:Name="lstSubCategory"
SelectionMode="Multiple"
ItemsSource="{Binding SubCategories}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding SubCategoryName}"
FontSize="28"
TextWrapping="Wrap"
VerticalAlignment="Top"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
</StackPanel>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
还有 ViewModel:
public List<Category> Categories { get; set; }
public PostCategorySelectVM()
{
Categories = new List<Category>()
{
new Category()
{
CategoryID = 0,
CategoryName = "Bread",
SubCategories = new List<SubCategory>()
{
new SubCategory() {
CategoryID = 001,
SubCategoryName = "Loaf"
},
new SubCategory() {
CategoryID = 002,
SubCategoryName = "Croissant"
}
// ...
}
// ...
}
// ...
}
}
类别类:
public class Category
{
public int CategoryID { get; set; }
public string CategoryName { get; set; }
public List<SubCategory> SubCategories { get; set; }
}
子类别类:
public class SubCategory
{
public int CategoryID { get; set; }
public string SubCategoryName { get; set; }
}
保存按钮点击事件:
private void btnSave_Click(object sender, RoutedEventArgs e)
{
foreach (Category item in lstCategory.SelectedItems)
{
catList.Add(item);
}
foreach (Category cat in catList)
{
scatList = cat.SubCategories;
foreach (SubCategory scat in scatList)
{
// How do I select the "Selected" SubCategories?
// How do I select the lstSubCategory control?
}
}
}
最后说明:
- 我唯一的线索与依赖属性有关,但我见过的唯一示例需要 FrameworkPresentation.dll,它在 WP7 上不可用。
- 嵌套的 ListBox 具有预期的 UI 功能(大型列表在滚动时删除交叉选择除外)
- 当类别和子类别都显示在同一屏幕上时,用户体验感觉最好。
- 考虑像目录搜索引擎这样的 UI 功能。您可能希望以不同的组合选择一般类别和/或子类别,但父项不应要求子项,子项不应要求父项,但子项和父项都可以存在(为了具体)。
【问题讨论】:
标签: windows-phone-7 listbox nested dependency-properties multi-select