2011-02-23 54 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> 

我希望它能幫助