c# - 仅在子项上带有复选框的 TreeView

标签 c# wpf xaml treeview

我有一个这种类型的 XML 文档。

<?xml version="1.0" encoding="utf-8"?>
<Parameters>
  <Param Name="Father0_0" ID="1">
    <Param0 Name="Father0_1" ID="2">
      <Param1 Name="Father0_2" ID="3">
        <Param2 Name="Child0_0" ID_ch="1"/>
      </Param1>
      <Param1 Name="Father0_3" ID="4">
        <Param2 Name="Father0_4" ID="5">
          <Param3 Name="Child0_3" ID_ch="2"/>
        </Param2>
      </Param1>
    </Param0>
  </Param>
  <Param Name="Father1_0" ID="6">
    <Param0 Name="Child1_0" ID_ch="3" />
  </Param>
  <Param Name="Father2_0" ID="7">
    <Param1 Name="Child2_0" ID_ch="3"/>
  </Param>
 <Param Name="Child3_0" ID_ch="4"/>
</Parameters>

.CS

所以我加载我的 XML

XmlDataProvider _xml = FindResource("xmldata") as XmlDataProvider;
var xmlDocument = new XmlDocument();
xmlDocument.Load("34.xml");
_xml.Document = xmlDocument;

如果我按照下面 XAML 中的描述这样做,我会在 TreeView 中的所有项目上得到 Chechkboks?

.XAML

<Window.Resources>
 <XmlDataProvider x:Key="xmldata" XPath="Parameters"/>
<!--The same is done for the Param0,Param1,Param2,Param3 changing DataType=""-->
 <HierarchicalDataTemplate DataType="Param" ItemsSource="{Binding XPath= ./*}">
   <StackPanel Orientation="Horizontal">
    <CheckBox Margin="5,0,0,0" Content="{Binding XPath=@Name}" />
   </StackPanel>
 </HierarchicalDataTemplate>
<!-------------------------------->
</Window.Resources>
<Grid>
 <TreeView ItemsSource="{Binding Source={StaticResource xmldata}, XPath=Param}"  />
</Grid>

如何制作一个仅供 child 使用的复选框。

最佳答案

在 XML 数据的情况下自定义 TreeView 的更通用方法是制作您自己的数据模板选择器:

public class ItemTemplateSelector : DataTemplateSelector
{
    public DataTemplate ParentTemplate { get; set; }

    public DataTemplate ChildTemplate { get; set; }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        var element = item as XElement;
        if (element != null)
        {
            return element.Elements().Any() ? ParentTemplate : ChildTemplate;
        }

        return base.SelectTemplate(item, container);
    }
}

下面是它在 XAML 中的使用方式:

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication2"
        Title="MainWindow" Height="350" Width="525">

    <Window.Resources>
        <local:ItemTemplateSelector x:Key="ItemTemplateSelectorKey">

            <local:ItemTemplateSelector.ParentTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Elements}">
                    <TextBlock Text="{Binding Attribute[Name].Value}"/>
                </HierarchicalDataTemplate>
            </local:ItemTemplateSelector.ParentTemplate>

            <local:ItemTemplateSelector.ChildTemplate>
                <DataTemplate>
                    <CheckBox Content="{Binding Attribute[Name].Value}"/>
                </DataTemplate>
            </local:ItemTemplateSelector.ChildTemplate>

        </local:ItemTemplateSelector>
    </Window.Resources>

    <TreeView ItemsSource="{Binding Root.Elements}"
              ItemTemplateSelector="{StaticResource ItemTemplateSelectorKey}"/>
</Window>

代码隐藏:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = XDocument.Parse(Properties.Resources.XmlFile);
    }
}

这是结果:

enter image description here

请注意,我已经使用了 XDocument API 代替 XmlDocument 一个。

UPD
ChildTemplate 已稍微简化以提高可读性,但这在内容中显示下划线时存在问题(例如,请参阅 this 答案以获取解释)。

关于c# - 仅在子项上带有复选框的 TreeView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36790953/

相关文章:

C# 应用程序从 Java 类创建对象?

c# - 如何实例化一个窗口而不显示它?

c# - 如何将 ListView 项与 UWP 模型外部的数据绑定(bind)?

c# - 如何在 Visual Studio 中使用外部库?

wpf - DataTrigger 的 EnterAction/ExitAction 动画冲突

c# - 如何传递毫米中可用的矩形大小以使用 iTextsharp 创建文档

c# - 如何在通用文本 block 中显示所有验证错误消息

c# - 无法在 Windows Server 2012 中使用 powershell 或没有 gacutil 注册 dll gac

c# - 替换: One Property in ViewModel for each TextBox with B: One property returning a (observable) collection

c# - 使用本地数据库的 WPF C# 应用程序