2010-03-07 96 views
4

有人会如何将复选框添加到XAML中树视图的子项?我的目标是拥有一个树状视图,其中父级只是一个文本块,所有孩子都是复选框,但一次只能检查一个孩子。我没有问题,使整个树视图复选框,但我不知道如何得到我真正想要的任何建议?WPF TreeView和复选框

谢谢。

回答

5

要做到这一点,最简单的方法是调整数据的形状,以便树视图可以用您描述的方式表示。下面是对应于您的类型树的最小数据结构的例子:

public class CheckedList 
{ 
    public string Title { get; set; } 

    public ObservableCollection<CheckedItem> Items { get; private set; } 

    public CheckedList() 
    { 
     Items = new ObservableCollection<CheckedItem>(); 

     //DEBUG: Test data 
     Title = "Test Title"; 
     Items.Add(new CheckedItem("Item 1", true)); 
     Items.Add(new CheckedItem("Item 2", false)); 
    } 
} 

public class CheckedItem : DependencyObject 
{ 
    public static readonly DependencyProperty StateProperty = 
     DependencyProperty.Register("StateProperty", typeof(bool), typeof(CheckedItem), new UIPropertyMetadata(false)); 

    public static readonly DependencyProperty TextProperty = 
     DependencyProperty.Register("TextProperty", typeof (string), typeof (CheckedItem), new UIPropertyMetadata(string.Empty)); 

    public bool State 
    { 
     get { return (bool)GetValue(StateProperty); } 
     set { SetValue(StateProperty, value); } 
    } 

    public string Text 
    { 
     get { return (string) GetValue(TextProperty); } 
     set { SetValue(TextProperty, value); } 
    } 

    public CheckedItem(string text, bool state) 
    { 
     Text = text; 
     State = state; 
    } 
} 

这里是XAML和代码隐藏数据模板的窗口和树视图来表示数据与复选框文本标题项目:

<Window x:Class="TestApp.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="clr-namespace:TestApp" 
Title="Window1" Height="300" Width="300" Loaded="Window_Loaded"> 

<Window.Resources> 
    <HierarchicalDataTemplate DataType="{x:Type local:CheckedList}" ItemsSource="{Binding Items}"> 
     <TextBlock Text="{Binding Title}" /> 
    </HierarchicalDataTemplate> 

    <DataTemplate DataType="{x:Type local:CheckedItem}"> 
     <CheckBox Content="{Binding Text}" IsChecked="{Binding State, Mode=TwoWay}"></CheckBox> 
    </DataTemplate> 
</Window.Resources> 

<Grid> 
    <TreeView x:Name="ExampleTree"></TreeView> 
</Grid> 

代码隐藏:

public partial class Window1 : Window 
{ 
    ObservableCollection<CheckedList> _lists = new ObservableCollection<CheckedList>(); 

    public Window1() 
    { 
     InitializeComponent(); 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     //DEBUG: Test data 
     _lists.Add(new CheckedList()); 
     _lists.Add(new CheckedList()); 
     ExampleTree.ItemsSource = _lists; 
    } 
} 

ü唱ObservableCollection和DependencyObject允许树和数据结构保持同步。当用户点击树中的项目时,您应该能够查看您的列表并查看修改。或者,如果您修改数据,它应该反映在树中。

+0

我刚刚注意到你一次只想检查一个项目。如果是这样,您可以修改CheckedList以侦听CheckedItem.State的更改并执行您的规则。您可能需要考虑使用单选按钮而不是复选框,因为大多数用户希望复选框允许多选。 –

7

你为什么不直接在代码中做?像这样:

 TreeViewItem newItem = new TreeViewItem() 
     { 
      Header = "One" 
     }; 

     treeViewObjects.Items.Add(newItem); 

     TreeViewItem newItem1 = new TreeViewItem() 
     { 
      Header = new CheckBox() 
      { 
       Content = "Two" 
      } 
     }; 
     newItem.Items.Add(newItem1); 
+1

简单而高效。谢谢。 – eVerano

+0

我爱你的男人。 –

+0

嗨,这是工作,但只是为了子项目。如何添加复选框到父项目? –