Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.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/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
C# SilverLight中的TreeView存在问题_C#_Silverlight_Xaml_Treeview - Fatal编程技术网

C# SilverLight中的TreeView存在问题

C# SilverLight中的TreeView存在问题,c#,silverlight,xaml,treeview,C#,Silverlight,Xaml,Treeview,我的班级结构如下: class Organization { string Name; List<User> users; List<Organization> Children; } class User { string Name; } 我不能修改这些类。 我需要在一个TreeView控件中显示有关组织和用户的所有信息。即,组织节点应包含子组织和用户节点。 问题是在Silverlight中没有CompositeCollections

我的班级结构如下:

class Organization
{
    string Name;
    List<User> users;
    List<Organization> Children;
}

class User
{
    string Name;
}
我不能修改这些类。 我需要在一个TreeView控件中显示有关组织和用户的所有信息。即,组织节点应包含子组织和用户节点。
问题是在Silverlight中没有CompositeCollections或多绑定的情况下,我如何做到这一点

我误解了这个问题-我不知道SL树如何将Children属性和Users属性都显示为子节点。您可能希望创建一个具有AllChildren属性的包装类,该属性返回同一集合中的用户和组织。SL树的HierarcialDataTemplate有一个名为ItemsSource的属性,该属性应绑定到单个子集合。很抱歉,我帮不上什么忙-我想删除这个答案,但我看不到这样做的方法。

这个解决方案的棘手部分是必须处理每个节点下的两个集合,而TreeView的HierarchycalDataTemplate只支持绑定到单个ItemsSource

一个选项是创建一个ViewModel,将集合合并到一个类中,该类表示TreeView中的一个条目,然后可以绑定到HierarchycalDataTemplate中

首先,我创建了ViewModel类:

public class TreeViewEntry
{
    public string Name { get; set; }
    public IEnumerable<TreeViewEntry> Children { get; set; }
    public object Model { get; set; }
}
然后我使用一个函数、一些Linq和一些递归将所有对象拉入一个集合:

private IEnumerable<TreeViewEntry> OrganizationsToTreeViewEntries(IEnumerable<Organization> orgs)
{
    return (from o in orgs
            select new TreeViewEntry
            {
                Name = o.Name,
                Model = o,
                Children = (from u in o.Users
                            select new TreeViewEntry
                            {
                                Name = u.Name,
                                Model = u
                            }
                            ).Concat(OrganizationsToTreeViewEntries(o.Children))
            });
}


public MainPage()
{
    InitializeComponent();

    var items = OrganizationsToTreeViewEntries(existingOrganizationData);
    OrgTree.ItemsSource = items;
}
现在,我有了一个合并的ItemsSource,可以轻松设置HierarchycalDataTemplate的样式:

<UserControl.Resources>
    <common:HierarchicalDataTemplate x:Key="OrgTemplate" ItemsSource="{Binding Children}">
        <StackPanel>
            <TextBlock Text="{Binding Name}"  />
        </StackPanel>
    </common:HierarchicalDataTemplate>
</UserControl.Resources>

<Grid x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource SampleDataSource}}">
    <controls:TreeView x:Name="OrgTree" HorizontalAlignment="Left" Margin="8,8,0,8" Width="225" ItemTemplate="{StaticResource OrgTemplate}" />
</Grid>

如果要调整某些元素的视觉样式,可以使用ValueConverter调整FontWeight之类的内容。例如,在我的测试中,我在FontWeight上创建了一个ValueConverter,它绑定到TreeViewEntry的Model属性。

此XAML不满足用户的要求。它在哪里显示用户集合的任何详细信息,什么是ShortTitle?