Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Silverlight中将手风琴数据绑定到通用列表_Silverlight_Data Binding_Accordion - Fatal编程技术网

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

在Silverlight中将手风琴数据绑定到通用列表,silverlight,data-binding,accordion,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:Accor

给定包含两个属性(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的新手,所以我可能会错过一些显而易见的东西,但任何帮助都将不胜感激

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

  • 创建具有标题和名称集合的视图模型类
  • 使用LINQ(或简单的foreach)将现有的6个实体的列表转换为3个实体的列表,每个实体的名称集合中分别有3个、2个和1个名称
  • 将手风琴项目资源绑定到ViewModel对象集合
  • 将“手风琴项目”标题模板中的文本块绑定到“标题”属性
  • 将重复项控件(如ItemsControl)添加到手风琴项的内容模板中
  • 将重复项绑定到名称集合
假设你的模型如下

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; }
}
公共类视图模型
{
公共字符串标题{get;set;}
公共列表名称{get;set;}
}
公共类DataContextClass
{
公共DataContextClass()
{
var modelData=新modelData();
var query=来自modelData.ModelCollection中的m
m组按m组标题
在vm中选择newviewmodel{Title=vm.Key,Names=vm.select(x=>x.Name).ToList()};
ViewModelCollection=query.ToList();
}
公共列表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>

您也可以改用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; }
公共类DataContextClass{
公共DataContextClass()
{
var modelData=新modelData();
var query=来自modelData.ModelCollection中的m
m组按m组标题
进入vm select Tuple.Create(vm.Key,vm.select(x=>x.Name).ToList()};
Collection=query.ToList();
}
公共元组集合{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>


我希望这能有所帮助

谢谢BenDr,这真是一种享受。我真不敢相信人们花了这么长时间才回答这个问题!任何人都会认为Silverlight的吸收速度很慢或是什么的……问题是,只有真正聪明的人才能在Silverlight中做简单的事情。如果反过来也是真的,我会选择w内部。@BenCr我有一个类似的问题,我希望你能对@Mike有所启发,这个答案与Silverlight有关,而不是ASP.NET AJAX。对不起。