WPF TreeView刷新

2024-03-07

我有一个问题。我用TreeView在我的 WPF 项目中可视化我的 XML 数据。问题是,当我编辑我的XmlDocument它不会刷新TreeView。但我注意到当我检查时SelectedNode,这是我编辑的XmlNode。所以我的“编辑”方法工作正常,但只有树的视觉刷新存在问题。.Refresh() or .Items.Refresh()也不行。

这是我的树的模板:

<DataTemplate x:Key="AttributeTemplate">
    <StackPanel Orientation="Horizontal"
            Margin="3,0,0,0"
            HorizontalAlignment="Center">
        <TextBlock Text="{Binding Path=Name}"
             Foreground="{StaticResource xmAttributeBrush}" FontFamily="Consolas" FontSize="8pt" />
        <TextBlock Text="=&quot;"
             Foreground="{StaticResource xmlMarkBrush}" FontFamily="Consolas" FontSize="8pt" />
        <TextBlock Text="{Binding Path=Value, Mode=TwoWay}"
             Foreground="{StaticResource xmlValueBrush}" FontFamily="Consolas" FontSize="8pt" />
        <TextBlock Text="&quot;"
             Foreground="{StaticResource xmlMarkBrush}" FontFamily="Consolas" FontSize="8pt" />
    </StackPanel>
</DataTemplate>

<HierarchicalDataTemplate x:Key="NodeTemplate">
    <StackPanel Orientation="Horizontal" Focusable="False">
        <TextBlock x:Name="tbName" Text="?" FontFamily="Consolas" FontSize="8pt" />
        <ItemsControl
            ItemTemplate="{StaticResource AttributeTemplate}"
            ItemsSource="{Binding Path=Attributes}"
            HorizontalAlignment="Center">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>
    </StackPanel>
    <HierarchicalDataTemplate.ItemsSource>
        <Binding XPath="*" />
    </HierarchicalDataTemplate.ItemsSource>
    <HierarchicalDataTemplate.Triggers>
        <DataTrigger Binding="{Binding Path=NodeType}" Value="Text">
            <Setter TargetName="tbName" Property="Text" Value="{Binding Path=Value, Mode=TwoWay}"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=NodeType}" Value="Element">
            <Setter TargetName="tbName" Property="Text" Value="{Binding Path=Name}"/>
        </DataTrigger>
    </HierarchicalDataTemplate.Triggers>
</HierarchicalDataTemplate>

<Style x:Key="TreeViewAllExpandedStyle"  TargetType="{x:Type TreeView}">
    <Style.Resources>
        <Style TargetType="TreeViewItem">
            <Setter Property="IsExpanded" Value="True" />
        </Style>
    </Style.Resources>
</Style>

<Style x:Key="TreeViewAllCollapsedStyle" TargetType="{x:Type TreeView}">
    <Style.Resources>
        <Style TargetType="TreeViewItem">
            <Setter Property="IsExpanded" Value="False" />
        </Style>
    </Style.Resources>
</Style>

这里有Window.Resources:

<Window.Resources>
    <XmlDataProvider x:Key="XmlData" />
</Window.Resources>

这是我的树:

<TreeView x:Name="XmlTree" Grid.Row="1"
      ItemsSource="{Binding Source={StaticResource XmlData}, XPath=., Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
      ItemTemplate="{StaticResource NodeTemplate}"
      SelectedItemChanged="XmlTree_SelectedItemChanged" />

这是我的代码:

private XmlDocument _xml;
private XmlElement _selectedElement;
private XmlDataProvider _xmlDataProvider;

private void MainWindow_Load(object sender, EventArgs e)
{
    XmlTree.Style = (Style)FindResource("TreeViewAllExpandedStyle");
    _xmlDataProvider = FindResource("XmlData") as XmlDataProvider;
}

private void OpenXmlFile(string filePath)
{
    _xml = new XmlDocument();
    _xml.Load(filePath);

    _xmlDataProvider.Document = _xml;
}

private void SaveChangesButton_Click(object sender, EventArgs e)
{
    Dictionary<string, string> newAttributes = GetChangedAttributes();
    foreach (KeyValuePair<string, string> pair in newAttributes)
    {
        _selectedElement.SetAttribute(pair.Key, pair.Value);
    }

    RefreshViews();
}

private void RefreshViews()
{
    // now I don't know what to do here, any Refresh doesn't work:S
}

第二件事是,如何清除我的树以便能够再次将其用于其他数据(我已经NullReferenceException在尝试的同时XmlTree.Items.Clear();


经过几个小时终于找到解决办法了!

private void RefreshViews()
{
    XmlEditor.Clear();
    XmlEditor.Text = IndentXml();

    UnselectSelectedItem();

    XmlTree.Items.Refresh();
    XmlTree.UpdateLayout();
}

private void UnselectSelectedItem()
{
    if (XmlTree.SelectedItem != null)
    {
        var container = FindTreeViewSelectedItemContainer(XmlTree, XmlTree.SelectedItem);
        if (container != null)
        {
            container.IsSelected = false;
        }
    }
}

private static TreeViewItem FindTreeViewSelectedItemContainer(ItemsControl root, object selection)
{
    var item = root.ItemContainerGenerator.ContainerFromItem(selection) as TreeViewItem;
    if (item == null)
    {
        foreach (var subItem in root.Items)
        {
            item = FindTreeViewSelectedItemContainer((TreeViewItem)root.ItemContainerGenerator.ContainerFromItem(subItem), selection);
            if (item != null)
            {
                break;
            }
        }
    }

    return item;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF TreeView刷新 的相关文章

  • 如何使用 ILoggerFactory 记录 Polly 的重试

    或者 如何从静态方法记录 From https github com App vNext Polly https github com App vNext Polly你有这样的例子 其中记录器神奇地可用 Policy Timeout 30
  • 使用 C++ 拆分“[常规设置]”格式的节字符串

    我是 C 新手 我想读取包含部分和键值对的 ini 文件 根据部分 我想读取相应键的值 首先 我想阅读方括号内的部分 请帮忙 谢谢 对于真正的 INI 文件解析 我强烈建议iniparser库 http ndevilla free fr i
  • 使用 JSON 格式正确配置 NLog 到 IHostBuilder

    我有以下代码 应该接受 NLog 的 JSON appsettings 配置 然后使用它来创建 NLog LogFactory 这个 NLog 工厂应该被传递到 MyService 类中 以便在那里创建一个记录器 class Program
  • 每次调用新方法时触发事件

    我正在做一个logger for a c 应用程序需要记录每个方法被调用的时间以及每个方法执行时间 我可以通过调用自己的方法来做到这一点EventLogger LogMethodCall方法在每个方法的开头 但我想知道是否有办法使CLR每次
  • 操作/Lambda 表达式内存管理问题

    我将一个操作存储在局部变量中 然后在该局部变量超出范围后使用 使用前是否有被清理的危险 这是一个例子 public List GetMaps Action
  • 将 Python 控制台集成到 GUI C++ 应用程序中

    I m going to add a python console widget into a C GUI below some other controls 许多类将暴露给 python 代码 包括一些对 GUI 的访问 也许我会考虑 P
  • Confuser .NET 混淆器。安全吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我目前正在开发一个应用程序 其中阻止用户反编译代码非常重要 现在 我意识到 如果由经验丰富的程序员执行 大多数 exe 都是可反编译的
  • 无缝滚动瓷砖地图

    我正在开发一个自上而下的角色扮演游戏 并且想要实现无缝滚动地图 也就是说 当玩家探索世界时 地图之间没有加载屏幕 也没有通往下一个区域的 门 我有两种方法可以打破世界 在顶层 我有 区域 它只是 9 个 地图 的集合 这些区域仅由目录表示
  • 读取STM32 MCU SPI数据寄存器的值

    有很多类似的问题 但似乎没有一个问题完全相同 我正在将 STML4 MCU 连接到 6 轴传感器 LSM6DS3 我已经成功地在 I2C 中实现了所有内容 但想要 SPI 的额外速度 和 DMA 如果我能让这些第一步工作起来的话 因此 第一
  • 使用 INotifyPropertyChanged

    有人可以解释一下为什么在 wpf 中使用绑定时需要使用 INotifyPropertyChanged 的 实现吗 我可以在不实现此接口的情况下绑定属性吗 例如我有代码 public class StudentData INotifyProp
  • 使用 QGraphicsScene 实现流畅的动画

    我希望我的问题并不总是同样的问题 我有一个 QGraphicsScene 它的项目是一些 QGraphicsPixmap 我用一个计时器来移动它们 每秒 SetX 10 我设置 10是因为窗口大100 使用这个解决方案我的动画不流畅 我想我
  • 数组与映射的性能

    我必须循环一个大数组中的元素子集 其中每个元素都指向另一个元素 问题来自于检测大图中的连接组件 我的算法如下 1 考虑第一个元素 2 将下一个元素视为前一个元素所指向的元素 3 循环直到没有发现新元素 4 考虑1 3中尚未考虑的下一个元素
  • SQL参数化查询不显示结果

    我的 DataAcess 类中有以下函数 但它没有显示任何结果 我的代码如下 public List
  • TreeView:仅在子节点中存在复选框

    我需要一个树视图控件 根节点没有复选框 只有图像 所有子节点都有一个复选框 图像 C net 2 0 winforms 不是 wpf WinForms树视图默认不支持混合复选框 非复选框节点 您可以在树视图上全局启用复选框 并使用以下命令在
  • 非静态类中的静态方法和静态类中的静态方法有什么区别?

    我有两个班级A级和B级 static class ClassA static string SomeMethod return I am a Static Method class ClassB static string SomeMeth
  • 为什么我不能对普通变量进行多态?

    我是一名Java程序员 最近开始学习C 我对某事感到困惑 据我了解 在 C 中 要实现多态行为 您必须使用指针或引用 例如 考虑一个类Shape与实施的方法getArea 它有几个子类 每个子类都以不同的方式重写 getArea 然后考虑以
  • 连接两个表的查询的 SQL Server“FOR XML”输出

    我是 SQL Server 中 FOR XML 功能的新手 我正在使用 SQL Server 2012 我有两个表 Word 和 Word Expansion 样本数据 表 字 WordOID Word 1 PIPE 2 WIRE 表 Wo
  • OpenGL 计算着色器调用

    我有一个与新计算着色器相关的问题 我目前正在研究粒子系统 我将所有粒子存储在着色器存储缓冲区中 以便在计算着色器中访问它们 然后我派遣一个一维工作组 define WORK GROUP SIZE 128 shaderManager gt u
  • 如何在没有 Visual Studio 的情况下将新文件添加到 .csproj 文件

    如何添加新文件到 csproj从命令提示符 我认为没有任何工具可以响应命令行上的 add project 命令来执行此操作 但我认为您可以幸运地创建一个程序 脚本来直接操作 csproj 文件的 XML 内容 csproj 文件的结构如下所
  • 如何在用户空间程序中使用内核 libcrc32c (或相同的函数)?

    我想在我自己的用户空间程序中进行一些 CRC 检查 我发现内核加密库已经在系统中 并且支持 SSE4 2 我尝试直接 include

随机推荐

  • 如何使用 Moq 测试 ServiceStack 服务

    我有一个使用 ServiceStack 创建的休息服务 使用 nHibernate 作为从 SqlCe 数据库获取数据的方式 我一直在尝试使用 nUnit 和 Moq 编写一些单元测试 我已成功模拟 nHibernate 实现以返回 nul
  • 如何在 Android 应用程序中将 SD 卡图像添加到电子邮件正文中

    我想将图像添加到电子邮件正文中 我不在邮件中使用附件 String imagepath Imagepath Environment getExternalStorageDirectory File separator ImagesCmas
  • 在 XML-RPC 或 SOAP 中实现回调

    我试图了解如何使用 SOAP 或 XML RPC 为我的产品创建远程 开放的 API 问题是 我的 API 的一部分将要求我能够将事件从服务器推送到客户端 我将需要能够 发送回调 而不仅仅是 调用函数 作为我的 API 的一部分 在 SOA
  • Haskell 中是否有自动记忆全局多态值的方法?

    多态 常量 例如5 Num a gt a 并不是真正的常量 而是字典参数的函数 因此 如果您定义 primes Num n gt n primes Bad example of course there s no good reason h
  • 使用 tomcat 读取 spring boot 上的控制台输入

    是否可以在 Spring Boot 上的嵌入式 tomcat 启动之前读取控制台输入 假定的应用程序流程是 向用户请求用户名和密码 这将用于启动应用程序 它在使用时有效java jar命令 问题是当我关闭控制台 Linux 上的 SSH 时
  • MongoDB填写查询结果中不包含的数据

    假设我有一个包含以下数据的集合 date ISODate 2018 01 01T00 00 00Z count 3 date ISODate 2018 01 04T00 00 00Z count 5 我应该使用什么 mongodb 函数才能
  • 尝试理解 ScrollView 内 LinearLayout 的边距

    我需要有一个LinearLayout里面一个SrollView然后LinearLayout必须有一个余量ScrollView 起初 我能想到解决这个问题的唯一方法就是LinearLayout在另一个里面LinearLayout在最后一个布局
  • 无法使用 QWebEngineView 渲染网页

    我一直在尝试将网页渲染到 PyQt5 中的小部件上 这些是我的设置 PyQt 5 15 4 PyQtWebEngine 5 15 4 PyQt5 工具 5 15 4 2 我正在尝试渲染一些基本网站 例如 google com 但我面临着一个
  • 为什么枚举数组可以转换为两种不同的 IEnumerable 类型?

    我似乎在 C 中偶然发现了一些我不完全理解的不寻常的东西 假设我定义了以下枚举 public enum Foo short The values aren t really important A B 如果我声明一个数组Foo或通过检索一个
  • Spark SQL 中的 Cross Join 计算

    我有一个临时视图 仅1记录 值 我想使用该值来计算另一个大表中存在的客户的年龄 带有100M 行 我用了一个CROSS JOIN条款 这会导致性能问题 有没有更好的方法来实现这个要求 并且性能会更好 会不会broadcast提示适合这种情况
  • 如何正确解释作为字符串接收的 JSON 对象?

    我的网络服务已损坏 无法访问和更改 它发送一些主要不错的 JSON 但其中一个属性是作为字符串发送的嵌套 JSON 对象 http www ireland com api getitemweb 185213 http www ireland
  • 在 C++ 中使用“void”模板参数

    采取以下最小示例 using Type1 std function
  • 使用循环向mysql插入100000条数据

    我想在mysql中用循环插入数据 100000 当我运行没有错误 但数据没有插入到我的表中时 这是我的查询 DELIMITER DECLARE i INT DEFAULT 1 WHILE i lt 100 DO INSERT INTO vo
  • 使用 RestTemplate 的 Spring Web 服务的超时配置

    我想使用 RestTemplate 在客户端为 Spring Web 服务配置超时 我尝试了以下配置
  • 批处理文件:列出特定文件夹中的rar文件并将结果写入文本文件

    我有一个文件夹 其中包含一些 rar 文件和子文件夹 这些子文件夹包含 rar 文件或子文件夹 递归结构 我想编写一个批处理文件 列出此文件夹树 完整路径 中的所有 rar 文件 结果被写入文本文件 Example 具体文件夹 Quest
  • WordPress - 将特色图像添加到自定义帖子类型

    我正在尝试将特色图像添加到我的主题中 但不适用于帖子或页面 我创建了一个名为 属性 的自定义类型 用于房地产经纪人 那么如何启用特色图像 因为它没有出现在场景选项中 希望有人能帮忙 property new Cuztom Post Type
  • Oracle无法从LONG数据类型转换为CLOB数据类型(数据类型不一致错误)

    Oracle 11g 在尝试将 long 数据类型转换为 clob 时出现以下错误 我尝试 select to lob long col name from table1 I get Error Execution 1 39 ORA 009
  • 定制频道wifi直连

    谁能告诉我 有没有自定义 wifi direct 频道的选项 我不仅需要在 ch1 ch6 和 ch11 之间进行自定义 还需要在我选择的其他频道中进行自定义 我怎样才能做到这一点 要更改设备 Wifi Direct 的频道 您需要执行以下
  • 设置创建或更改时间戳

    Using utimes futimes futimens等等 可以设置文件的访问和修改时间戳 修改时间是文件数据最后一次改变的时间 同样 ctime 或更改时间是文件属性 例如权限 最后一次更改的时间 Linux POSIX 维护三个时间
  • WPF TreeView刷新

    我有一个问题 我用TreeView在我的 WPF 项目中可视化我的 XML 数据 问题是 当我编辑我的XmlDocument它不会刷新TreeView 但我注意到当我检查时SelectedNode 这是我编辑的XmlNode 所以我的 编辑