【问题标题】:WPF TreeView and CheckboxWPF 树视图和复选框
【发布时间】:2011-01-24 14:20:36
【问题描述】:

有人会如何在 XAML 中只为树视图的子级添加复选框?我的目标是有一个树视图,其中父级只是一个文本块,所有子级都是复选框,但一次只能检查一个子级。制作整个树视图复选框没有问题,但我不确定如何获得我真正想要的任何建议?

谢谢。

【问题讨论】:

    标签: wpf treeview checkbox


    【解决方案1】:

    【讨论】:

      【解决方案2】:

      执行此操作的最简单方法是对数据进行整形,以便树视图可以按照您所描述的方式表示它。以下是与您的树类型相对应的最小数据结构示例:

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

      【讨论】:

      • 我刚刚注意到您只希望一次检查一项。如果这是真的,您可以修改 CheckedList 以侦听 CheckedItem.State 的更改并强制执行您的规则。您可能需要考虑使用单选按钮而不是复选框,因为大多数用户都希望复选框允许多选。
      【解决方案3】:

      你为什么不直接用代码来做呢?像这样:

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

      【讨论】:

      • 简单高效。谢谢。
      • 嗨,它可以工作,但仅适用于子项目。如何将复选框添加到父项?
      • 子使用:新的 CheckBox() 和父只是文本,也添加到父 CheckBox
      猜你喜欢
      • 1970-01-01
      • 2014-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多