【问题标题】:Databinding Accordion to Generic List in SilverlightSilverlight 中通用列表的数据绑定手风琴
【发布时间】:2011-02-23 09:52:57
【问题描述】:

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

【问题讨论】:

    标签: silverlight data-binding accordion


    【解决方案1】:

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

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

    【讨论】:

    • 感谢 BenDr,这是一种享受。我不敢相信这么长时间才有人回答这个问题!任何人都会认为 Silverlight 的使用速度很慢或其他什么...
    • 问题只是需要一个非常聪明的人才能在 Silverlight 中做简单的事情。
    • 如果反过来也是如此,我会成为赢家。
    • @BenCr 我有一个类似的问题,我希望你能对stackoverflow.com/questions/8126053/…有所了解@
    • @Mike,这个答案与 Silverlight 相关,而不是 ASP.NET AJAX。对不起。
    【解决方案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>
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-22
      • 1970-01-01
      相关资源
      最近更新 更多