给定包含以下格式的两个属性(IdentityType和Name)的对象列表:
IdentityType | Name A | One A | Two A | Three B | Four B | Five C | Six
有没有办法声明数据绑定,所以手风琴显示如下?
A - One - Two - Three B - Four - Five C - Six
到目前为止,我能得到的最好的是每个项目的面板标题,如下所示:
<toolkit:Accordion ItemsSource="{Binding Path=Identities}" Grid.Row="2" SelectionMode="ZeroOrMore"> <toolkit:Accordion.ItemTemplate> <DataTemplate > <TextBlock Text="{Binding IdentityType,Converter={StaticResource EnumDescriptionConverter}}"/> </DataTemplate> </toolkit:Accordion.ItemTemplate> <toolkit:Accordion.ContentTemplate> <DataTemplate> <StackPanel Margin="5" Orientation="Horizontal"> <TextBlock Text="{Binding Name}" Foreground="White" /> </StackPanel> </DataTemplate> </toolkit:Accordion.ContentTemplate> </toolkit:Accordion>
我是Silverlight的新手,所以我可能会遗漏一些令人眼花缭乱的东西,但任何帮助都会非常感激!
解决方法
您可以在模型(initail列表)和视图(标记)之间使用视图模型执行此操作.
>使用Title和NameCollection创建视图模型类
>使用LINQ(或简单的foreach)将现有的6个实体列表转换为3个entite的列表,分别在其名称集合中包含3个,2个和1个名称.
>将Accordions ItemsSource绑定到ViewModel对象的集合.
>将您的accordion项目标题模板中的文本块绑定到Title属性
>将ItemsControl等重复项控件添加到手风琴项的内容模板中
>将重复项绑定到NamesCollection
假设你的模型如下……
public class Model { public string Title { get; set; } public string Name { get; set; } }
您的视图模型结构应该是……
public class ViewModel { public string Title { get; set; } public List<string> Names { get; set; } } public class DataContextClass { public DataContextClass() { var modelData = new ModelData(); var query = from m in modelData.ModelCollection group m by m.Title into vm select new ViewModel { Title = vm.Key,Names = vm.Select(x => x.Name).ToList() }; ViewModelCollection = query.ToList(); } public List<ViewModel> ViewModelCollection { get; set; } }
然后您的视图可以创建DataContextClass的实例,将其分配给它自己的DataContext属性,然后使用此标记…
<layout:Accordion ItemsSource="{Binding Path=ViewModelDataInstance.ViewModelCollection}" > <layout:Accordion.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding Title}" /> </DataTemplate> </layout:Accordion.ItemTemplate> <layout:Accordion.ContentTemplate> <DataTemplate> <ItemsControl ItemsSource="{Binding Path=Names}" /> </DataTemplate> </layout:Accordion.ContentTemplate> </layout:Accordion>