如何在XAML中仅将复选框添加到树视图的子级?我的目标是拥有一个树视图,其中父级只是一个文本块,所有子项都是复选框,但一次只能选择一个子项。我没有问题使整个树视图成为复选框,但我不确定如何得到我真正想要的结果。有什么建议吗?
谢谢。
TreeViewItem newItem = new TreeViewItem()
{
Header = "One"
};
treeViewObjects.Items.Add(newItem);
TreeViewItem newItem1 = new TreeViewItem()
{
Header = new CheckBox()
{
Content = "Two"
}
};
newItem.Items.Add(newItem1);
最简单的方法是通过整理数据,使得树形视图能够以你所描述的方式呈现它。以下是一个最小数据结构示例,与你的树型结构相对应:
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;
}
}
<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;
}
}