【问题标题】:Add Check Box for Treeview parent nodes only Wpf仅为 Treeview 父节点添加复选框 Wpf
【发布时间】:2014-12-15 06:48:14
【问题描述】:

我想为可观察集合的树视图添加复选框。以下代码为所有父节点和子节点添加复选框。我只需要对父节点有什么办法可以实现这个...

<HierarchicalDataTemplate x:Key="LogFolderExplorer" DataType="{x:Type TestAutomationClient:TestArtifact}" ItemsSource="{Binding Children}">
        <StackPanel Orientation="Horizontal" MinWidth="200">
            <CheckBox
            Focusable="False" 
            IsChecked="{Binding IsChecked}" 
            VerticalAlignment="Center"
            />
            <TextBlock Text="{Binding Name}" FontSize="14"/>
        </StackPanel>
    </HierarchicalDataTemplate>

【问题讨论】:

    标签: wpf treeview


    【解决方案1】:

    有很多方法可以实现这一目标。

    其中一个:

    您可以转到 TestAutomationClient:TestArtifact 的 ViewModel,并在此处添加 bool 属性:

    public bool IsEmpty { get { return !this.Children.Any() } }
    

    您应该在整个集合发生更改时更新它(如果是这种情况),即您应该使用 RaisePropertyChanged("IsEmpty")。如果您使用某种 ICollectionView - 您的 ViewModel 上不需要该属性。

    <HierarchicalDataTemplate x:Key="LogFolderExplorer" 
                              DataType="{x:Type TestAutomationClient:TestArtifact}"
                              ItemsSource="{Binding Children}">
        <StackPanel Orientation="Horizontal" MinWidth="200">
            <CheckBox Focusable="False" 
                      IsChecked="{Binding IsChecked}" 
                      VerticalAlignment="Center">
                <CheckBox.Style>
                    <Style TargetType="CheckBox">
                        <Setter Property="Visibility" Value="Visible" />
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding IsEmpty}" Value="True">
                                <Setter Property="Visibility" Value="Collapsed" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </CheckBox.Style>
            </CheckBox>
            <TextBlock Text="{Binding Name}" FontSize="14"/>
        </StackPanel>
    </HierarchicalDataTemplate>
    

    【讨论】:

      【解决方案2】:

      您需要一个带有转换器的 DataTrigger。触发器应如下所示,

      <HierarchicalDataTemplate ItemsSource="{Binding SubItems}">
          <StackPanel Orientation="Horizontal">
              <CheckBox x:Name="chk" Visibility="Collapsed"/>
              <TextBlock Text="{Binding Name}"
                          VerticalAlignment="Center"
                          Margin="3 0" />
          </StackPanel>
          <HierarchicalDataTemplate.Triggers>
              <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource TreeLevelFinder}}" 
                           Value="True">
                  <Setter Property="Visibility"
                          TargetName="checkBox"
                          Value="Visible" />
              </DataTrigger>
          </HierarchicalDataTemplate.Triggers>
      </HierarchicalDataTemplate>
      

      整个 TreeViewItem 被发送到转换器。转换器将寻找一个视觉父级。如果它找到一个 Parent 作为 TreeView,它是第一级。如果它找到 TreeViewItem,那么它是子级别。

      public class TreeLevelFinder : IValueConverter
      {
          public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
          {
              if (value is FrameworkElement)
              {
                  var element = value as FrameworkElement;
                  var treeItem = element.TemplatedParent as TreeViewItem;
                  var parent = treeItem.FindAncestor<ItemsControl>();
                  if (parent is TreeView)
                  {
                      return true;
                  }
              }
              return false;
          }
      
          public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
          {
              throw new NotImplementedException();
          }
      }
      

      扩展方法FindAncestor&lt;T&gt;this link中可用。

      【讨论】:

        猜你喜欢
        • 2017-07-04
        • 2015-06-18
        • 1970-01-01
        • 2023-04-10
        • 1970-01-01
        • 2011-04-22
        • 1970-01-01
        • 2010-09-28
        • 1970-01-01
        相关资源
        最近更新 更多