2011-02-23 42 views
3

给出一个包含有两个属性(IdentityType和名称)格式的对象的列表:数据绑定手风琴泛型列表在Silverlight

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,所以我可以失去了一些东西言自明,但任何帮助将非常感谢!

回答

5

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

  • 创建一个标题视图模型类和NameCollection
  • 使用LINQ(或一个简单的foreach),以现有的6个实体列表转换成3周的entites 3,2和1名在列表他们的名字收藏分别。
  • 将您的Accordions ItemsSource绑定到ViewModel对象的集合。
  • 绑定在你的手风琴项目的文本块头部模板到你的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> 
+0

感谢BenDr,一个可行的治疗。我无法相信任何人回答这个问题都需要很长时间!任何人都会认为Silverlight摄取速度很慢或者其他什么...... – Town 2011-03-08 16:51:40

+0

问题在于,需要一个真正聪明的人才能够在Silverlight中做简单的事情。 – BenCr 2011-03-08 16:54:29

+0

如果反过来也是如此,我会赢得冠军。 – Town 2011-03-08 17:40:29

2

您还可以使用元组来代替。 代码变为:

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> 

我希望它能帮助