【问题标题】:TreeView with CheckBoxes dynamically WPF. How to know the name of the elements selected带有 CheckBoxes 的 TreeView 动态 WPF。如何知道所选元素的名称
【发布时间】:2017-09-11 18:35:24
【问题描述】:

我有一个代码,可以在 TreeView 中显示文件和文件夹名称,并从每个元素中放置一个复选框。我不知道该怎么做是如何知道 TreeView 中使用复选框选中的元素。

XAML:

<TreeView Name="treeView" Grid.Row="10" Grid.ColumnSpan="3">
        <TreeView.Resources>
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="HeaderTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <CheckBox Focusable="False" IsChecked="False" VerticalAlignment="Center"/>
                                <TextBlock Text="{Binding}" Margin="5,0" />
                            </StackPanel>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </TreeView.Resources>
    </TreeView>

程序:

    DirectoryInfo di = new DirectoryInfo(folder);
    treeView.Items.Add(getTree(di));

    public TreeViewItem getTree(DirectoryInfo di)
    {
        TreeViewItem item = new TreeViewItem();
        item.Header = di.Name;
        item.FontWeight = FontWeights.Normal;
        foreach (DirectoryInfo s in di.GetDirectories())
        {
            item.Items.Add(getTree(s)); 
        }
        foreach (FileInfo fi in di.GetFiles())
        {
            item.Items.Add(fi.Name);
        }
        return item;
    }

【问题讨论】:

  • 虽然可以手动遍历 TreeView 中的项目,但我建议您将代码更改为 MVVM 方法。然后,您可以简单地遍历您的视图模型项,而无需担心视图的属性。

标签: c# wpf xaml checkbox treeview


【解决方案1】:

创建您自己的TreeViewItem 类型:

public class Node
{
    public string Name { get; set; }
    public bool IsChecked { get; set; }
    public List<Node> Children { get; } = new List<Node>();
}

将此类型的实例添加到TreeView

public Node getTree(DirectoryInfo di)
{
    Node item = new Node();
    item.Name = di.Name;
    foreach (DirectoryInfo s in di.GetDirectories())
    {
        item.Children.Add(getTree(s));
    }
    foreach (FileInfo fi in di.GetFiles())
    {
        item.Children.Add(new Node { Name = fi.Name });
    }
    return item;
}

在视图中绑定到该类型的属性:

<TreeView Name="treeView" Grid.Row="10" Grid.ColumnSpan="3">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type local:Node}" ItemsSource="{Binding Children}">
            <StackPanel Orientation="Horizontal">
                <CheckBox Focusable="False" IsChecked="{Binding IsChecked}" VerticalAlignment="Center"/>
                <TextBlock Text="{Binding Name}" Margin="5,0" />
            </StackPanel>
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>

然后您可以递归地遍历项目并检查 IsChecked 属性的值:

private List<string> GetSelectedNames()
{
    List<string> selectedNames = new List<string>();
    foreach (var item in treeView.Items.OfType<Node>())
        GetSelected(item, ref selectedNames);
    return selectedNames;
}

public void GetSelected(Node node, ref List<string> s)
{
    if (node.IsChecked)
        s.Add(node.Name);

    foreach (Node child in node.Children)
        GetSelected(child, ref s);
}

如果您想更进一步,请将TreeViewItemsSource 属性绑定到您的视图模型的IEnumerable&lt;Node&gt; 属性并遍历该属性而不是@ 的Items 属性987654332@控制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    相关资源
    最近更新 更多