显示与Silverlight中的复选框关联的分层数据

时间:2012-08-22 14:09:16

标签: c# .net silverlight silverlight-5.0 hierarchical-data

您好,并提前感谢您的帮助, 我有一个父对象列表,其中每个父对象都有一个子对象列表。我希望以用户可以选择子对象的方式显示数据,按下按钮然后我将通过使用xml序列化程序序列化对象来保存所选的子对象及其父对象,可能是xml。显示器的外观应该是:

<sdk:Label x:Name="ParentLabel" content="ParentNameString" />
    <CheckBox x:Name="ChildCheckBox1" Content="ChildNameString" />
    <CheckBox x:Name="ChildCheckBox2" Content="ChildNameString" />
    <CheckBox x:Name="ChildCheckBox3" Content="ChildNameString" />
<sdk:Label x:Name="ParentLabel2" content="ParentNameString" />
    <CheckBox x:Name="ChildCheckBox4" Content="ChildNameString" />
    <CheckBox x:Name="ChildCheckBox5" Content="ChildNameString" />
    <CheckBox x:Name="ChildCheckBox6" Content="ChildNameString" />

我知道DataGrid控件中有一个复选框列的选项,但是我能通过Header / children显示层次关系吗?或者是否有一个选项可以在Listbox控件中进行datatemplating,以允许标题和相关的子元素?你会推荐什么? 再次感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

如果您只有一级ParentChild,则可以执行此类操作。

带有一些示例数据的简单代码隐藏

namespace SilverlightApplication2
{
    public partial class MainPage : UserControl 
    {
        public ObservableCollection<Parent> ParentList { get; set; }

        public MainPage()
        {
            Populate();
            InitializeComponent();
        }

        private void Save_Click(object sender, RoutedEventArgs e)
        {
          foreach (var child in ParentList
            .SelectMany(p => p.Children)
            .Where(c => c.IsSelected))
          {
            //Save the child
            Debug.WriteLine(string.Format("Child {0} saved", child.Name));
          }
        }

        private void Populate()
        {
            ParentList = new ObservableCollection<Parent>();
            ParentList.Add(new Parent
            {
                Name = "John",
                Children = new List<Child> { new Child { Name = "Paul" }, new Child { Name = "Pat" } }
            });

            ParentList.Add(new Parent
            {
                Name = "Mike",
                Children = new List<Child> { new Child { Name = "Bob" }, new Child { Name = "Alice" } }
            });

            ParentList.Add(new Parent
            {
                Name = "Smith",
                Children = new List<Child> { new Child { Name = "Ryan" }, new Child { Name = "Sue" }, new Child { Name = "Liz" } }
            });
        }
    }

    public class Parent
    {
        public string Name { get; set; }
        public List<Child> Children { get; set; }
    }

    public class Child
    {
        public string Name { get; set; }
        public bool IsSelected { get; set; }
    }
}

你的xaml会是这样的。

<UserControl x:Class="SilverlightApplication2.MainPage"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:my="clr-namespace:SilverlightApplication2"
             x:Name="MainUserControl"
             Width="400"
             Height="300"
             mc:Ignorable="d">
    <UserControl.Resources>
        <DataTemplate x:Key="ChildTemplate">
            <StackPanel Orientation="Horizontal">
                <CheckBox IsChecked="{Binding IsSelected}"/>
                <TextBlock Text="{Binding Name}" />
            </StackPanel>
        </DataTemplate>
        <DataTemplate x:Key="ParentTemplate">
            <StackPanel>
                <TextBlock Text="{Binding Name}" />
                <ListBox ItemsSource="{Binding Path=Children}" ItemTemplate="{StaticResource ChildTemplate}"/>
            </StackPanel>
        </DataTemplate>
    </UserControl.Resources>
    <StackPanel x:Name="LayoutRoot" Background="White">
        <ListBox ItemsSource="{Binding ElementName=MainUserControl, Path=ParentList}" ItemTemplate="{StaticResource ParentTemplate}"/>
    </StackPanel>
</UserControl>

这会产生这样的视图。为简单起见,我省略了所有样式,我相信你可以让它更性感;)

enter image description here

现在,您可以在后面的代码中仅使用Child true

处理IsSelected

如果您有多个级别...即.. 您的孩子有孩子,则必须使用HierarchicalDataTemplate