有人会如何在XAML中仅向树视图的子项添加复选框?我的目标是有一个树视图,其中父项只是一个文本块,所有子项都是复选框,但一次只能检查一个子项。我没有问题使整个树视图复选框,但我不知道如何得到我真正想要的任何建议?
感谢。
答案 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可以使树和数据结构保持同步。当用户点击树中的项目时,您应该能够查看列表并查看修改。或者,如果您修改数据,它应该反映在树中。