WPF TreeView和Checkbox

时间:2010-03-07 03:03:53

标签: wpf treeview checkbox

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

感谢。

3 个答案:

答案 0 :(得分:8)

为什么不在代码中执行此操作?像这样:

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

        treeViewObjects.Items.Add(newItem);

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

答案 1 :(得分:6)

答案 2 :(得分: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可以使树和数据结构保持同步。当用户点击树中的项目时,您应该能够查看列表并查看修改。或者,如果您修改数据,它应该反映在树中。