将手风琴数据绑定到Silverlight中的通用列表

时间:2011-02-23 09:52:57

标签: silverlight data-binding accordion

给定一个包含两个属性(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的新手,所以我可能会遗漏一些令人眼花缭乱的东西,但是非常感谢任何帮助!

2 个答案:

答案 0 :(得分:5)

您可以在模型(初始化列表)和视图(标记)之间使用视图模型执行此操作。

  • 使用Title和NameCollection创建视图模型类
  • 使用LINQ(或简单的foreach)将现有的6个实体列表转换为3个名称的列表,分别在其名称集合中包含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>

答案 1 :(得分:2)

您也可以使用Tuple。 代码变为:

public class DataContextClass{
public DataContextClass()
{
    var modelData = new ModelData();

    var query = from m in modelData.ModelCollection
                group m by m.Title
                into vm select Tuple.Create(vm.Key,  vm.Select(x => x.Name).ToList() };
    Collection = query.ToList();
}

public Tuple<string,List<string>> Collection { get; set; }

}

Xaml成为:

<layout:Accordion ItemsSource="{Binding Path=ViewModelDataInstance.ViewModelCollection}" >
<layout:Accordion.ItemTemplate>
    <DataTemplate>
        <TextBlock Text="{Binding Item1}" />
    </DataTemplate>
</layout:Accordion.ItemTemplate>
<layout:Accordion.ContentTemplate>
    <DataTemplate>
        <ItemsControl ItemsSource="{Binding Path=Item2}" />
    </DataTemplate>
</layout:Accordion.ContentTemplate>

我希望它有所帮助