2012-08-22 75 views
2

您好,感謝您的幫助, 我有一個父對象列表,其中每個父對象都有一個子對象列表。我想以用戶可以選擇子對象的方式顯示數據,按下按鈕,然後通過使用xml序列化器序列化對象,將選中的子對象及其父對象保存在xml中。的顯示應該是什麼樣子的想法是:在Silverlight中顯示與複選框相關的分層數據

<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控件複選框列的選擇,但我將能夠通過頁眉/兒童有顯示的層次關係?或者在Listbox控件中是否有選項可以允許標題和關聯的子元素?你會推薦什麼? 再次感謝您的幫助。

+0

原諒我的XAML中,我是從我的頭 – Christian

+0

頂部打字這是一個簡單的父/子關係?孩子們可以生孩子嗎? – cadrell0

+0

在這種情況下,孩子們沒有孩子 – Christian

回答

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後面的代碼IsSelected真正

如果你有一個以上一個水平... ..即你孩子有孩子你將不得不使用HierarchicalDataTemplate

+0

哇,謝謝這是一個完整的迴應。我認爲這應該適合我需要做的事情。我目前在Visual Studio中遇到了一些問題,所以我無法嘗試,但是我會讓你知道我的結果是什麼。再次感謝您的幫助。 – Christian