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刷新 的相关文章

  • 为什么基类必须有一个带有 0 个参数的构造函数?

    这不会编译 namespace Constructor0Args class Base public Base int x class Derived Base class Program static void Main string a
  • Linux TUN/TAP:无法从 TAP 设备读回数据

    问题是关于如何正确配置想要使用 Tun Tap 模块的 Linux 主机 My Goal 利用现有的路由软件 以下为APP1和APP2 但拦截并修改其发送和接收的所有消息 由Mediator完成 我的场景 Ubuntu 10 04 Mach
  • Guid 应包含 32 位数字和 4 个破折号

    我有一个包含 createuserwizard 控件的网站 创建帐户后 验证电子邮件及其验证 URL 将发送到用户的电子邮件地址 但是 当我进行测试运行时 单击电子邮件中的 URL 时 会出现以下错误 Guid should contain
  • 在 Xcode4 中使用 Boost

    有人设置 C Xcode4 项目来使用 Boost 吗 对于一个简单的 C 控制台应用程序 我需要在 Xcode 中设置哪些设置 Thanks 用这个来管理它 和这个
  • 如何在 Spring 属性中进行算术运算?

  • 如何用 kevent() 替换 select() 以获得更高的性能?

    来自Kqueue 维基百科页面 http en wikipedia org wiki Kqueue Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道 因此 可以修改事件过滤器以及接收待处理事件 同时每次主事件循环迭代仅使用对
  • 在 C# 中将位从 ulong 复制到 long

    所以看来 NET 性能计数器类型 http msdn microsoft com en us library system diagnostics performancecounter aspx有一个恼人的问题 它暴露了long对于计数器
  • 两组点之间的最佳匹配

    I ve got two lists of points let s call them L1 P1 x1 y1 Pn xn yn and L2 P 1 x 1 y 1 P n x n y n 我的任务是找到它们点之间的最佳匹配 以最小化它
  • 通过不同 DLL 或 EXE 中的指针或引用访问 STL 对象时发生访问冲突

    我在使用旧版 VC6 时遇到以下问题 我只是无法切换到现代编译器 因为我正在处理遗留代码库 http support microsoft com kb 172396 http support microsoft com kb 172396
  • 组合框项目为空但数据源已满

    将列表绑定到组合框后 其 dataSource Count 为 5 但组合框项目计数为 0 怎么会这样 我习惯了 Web 编程 而且这是在 Windows 窗体中进行的 所以不行combo DataBind 方法存在 这里的问题是 我试图以
  • 用于从字符串安全转换的辅助函数

    回到 VB6 我编写了一些函数 让我在编码时无需关心字符串的 null 和 数字的 null 和 0 等之间的区别 编码时 没有什么比添加特殊情况更能降低我的工作效率了用于处理可能导致一些不相关错误的数据的代码 9999 10000 如果我
  • UWP 无法在两个应用程序之间创建本地主机连接

    我正在尝试在两个 UWP 应用程序之间设置 TCP 连接 当服务器和客户端在同一个应用程序中运行时 它可以正常工作 但是 当我将服务器部分移动到一个应用程序并将客户端部分移动到另一个应用程序时 ConnectAsync 会引发异常 服务器未
  • 如何在Android中解析xml类型的HTTPResponse

    我有一个 Android 应用程序 我使用 POST 方法来获取响应 这是我的代码 HttpResponse httpResponse httpclient execute httppost HttpEntity resEntity htt
  • 内核开发和 C++ [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 从我know https stackoverflow com questions 580292 what languages are windo
  • 跨项目/dll 访问 Xaml 中的资源

    是否可以从另一个项目引用存储在 ResourceDictionary 构建操作 资源 中的 Xaml 资源 我想将资产合并到主项目的资源字典中或单独访问它们 例如 项目 MyResources 包含一个名为 Assets 的文件夹 其中有一
  • 我应该在应用程序退出之前运行 Dispose 吗?

    我应该在应用程序退出之前运行 Dispose 吗 例如 我创建了许多对象 其中一些对象具有事件订阅 var myObject new MyClass myObject OnEvent OnEventHandle 例如 在我的工作中 我应该使
  • 以编程方式使用自定义元素创建网格

    我正在尝试以编程方式创建一个网格 并将自定义控件作为子项附加到网格中 作为 2x2 矩阵中的第 0 行第 0 列 为了让事情变得更棘手 我使用了 MVVM 设计模式 下面是一些代码可以帮助大家理解这个想法 应用程序 xaml cs base
  • Azure函数版本2.0-应用程序blobTrigger不工作

    我有一个工作功能应用程序 它有一个 blob 输入和一个事件中心输出 在测试版中工作 随着最新的更改 我的功能不再起作用 我尝试根据发行说明更新 host json 文件 但它没有引用 blob 触发器 version 2 0 extens
  • 从类模板参数为 asm 生成唯一的字符串文字

    我有一个非常特殊的情况 我需要为类模板中声明的变量生成唯一的汇编程序名称 我需要该名称对于类模板的每个实例都是唯一的 并且我需要将其传递给asm关键字 see here https gcc gnu org onlinedocs gcc 12
  • 如何创建向后兼容 Windows 7 的缩放和尺寸更改每显示器 DPI 感知应用程序?

    我是 WPF 和 DPI 感知 API 的新手 正在编写一个在 Windows 7 8 1 和 10 中运行的应用程序 我使用具有不同每个显示器 DPI 设置的多个显示器 并且有兴趣将我的应用程序制作为跨桌面配置尽可能兼容 我已经知道可以将

随机推荐

  • 如何使用 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 所以我的 编辑