WPF MVVM TreeView 选定项

2023-11-26

这不可能这么困难。 WPF中的TreeView不允许设置SelectedItem,说该属性是ReadOnly。我填充了 TreeView,甚至在数据绑定集合更改时进行更新。

我只需要知道选择了什么项目。我正在使用 MVVM,因此没有代码隐藏或变量来引用树视图。这是唯一的解决方案我发现,但这是一个明显的黑客行为,它在 XAML 中创建另一个元素,该元素使用 ElementName 绑定将自身设置为树视图所选项目,然后您也必须绑定您的 Viewmodel。Several other 问题被问到这个问题,但没有给出其他可行的解决方案。

我见过这个问题,但是使用给出的答案会给我带来编译错误,由于某种原因,我无法将对 Blend sdk System.Windows.Interactivity 的引用添加到我的项目中。它说“未知错误 system.windows 尚未预加载”,我还没有弄清楚如何解决这个问题。

对于奖励积分:微软为什么要将此元素的 SelectedItem 属性设置为只读?


您实际上并不需要直接处理 SelectedItem 属性,而是绑定IsSelected到视图模型上的属性并在那里跟踪所选项目。

草图:

<TreeView ItemsSource="{Binding TreeData}">
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="IsSelected" Value="{Binding IsSelected}" />
        </Style>
    </TreeView.ItemContainerStyle>
</TreeView>
public class TViewModel : INotifyPropertyChanged
{
    private static object _selectedItem = null;
    // This is public get-only here but you could implement a public setter which
    // also selects the item.
    // Also this should be moved to an instance property on a VM for the whole tree, 
    // otherwise there will be conflicts for more than one tree.
    public static object SelectedItem
    {
        get { return _selectedItem; }
        private set
        {
            if (_selectedItem != value)
            {
                _selectedItem = value;
                OnSelectedItemChanged();
            }
        }
    }

    static virtual void OnSelectedItemChanged()
    {
        // Raise event / do other things
    }

    private bool _isSelected;
    public bool IsSelected
    {
        get { return _isSelected; }
        set
        {
            if (_isSelected != value)
            {
                _isSelected = value;
                OnPropertyChanged("IsSelected");
                if (_isSelected)
                {
                    SelectedItem = this;
                }
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
        var handler = this.PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF MVVM TreeView 选定项 的相关文章

  • Android ViewModel LiveData 在按钮单击时更新视图

    我正在关注这个tutorial https developer android com topic libraries architecture guide html common problems faced by app develop
  • 如何在 XAML/WPF 中存储和检索多个形状?

    使用 XAML WPF 做一些简单的事情似乎遇到了很多问题 我已经使用矩形和椭圆形等形状创建了一些基于 XAML 的图像来创建我需要应用程序的其他部分使用的图标 但我不能似乎找到了如何做到这一点 我似乎能够在资源字典中存储画布 但无法在任何
  • DataContractSerializer 事件/委托字段问题

    在我的 WPF 应用程序中 我正在使用DataContractSerializer序列化对象 我发现它无法序列化具有事件或委托声明的类型 考虑以下失败的代码 Serializable public abstract class BaseCl
  • “从另一方收到不安全或不正确安全的故障”

    我越来越 从另一方收到不安全或不正确安全的故障 有关故障代码和详细信息 请参阅内部故障异常 我已经在客户端完成了此操作 并且在控制台应用程序中完成了相同的操作 但是出现的错误可能是某些冲突 我已经检查过app config以及 Code i
  • 是否可以“缩放”WPF RichTextBox 中的文本?

    我注意到 WinForms RichTextBox 有一个ZoomFactor我认为这正是我想要的属性 不幸的是 WPF 变体似乎完全缺少此属性 有什么方法可以实现相同的功能 增加 减少整个文档的可见文本大小而不实际更改底层 RTF Upd
  • WPF 按钮需要单击两次才能触发 Click 事件

    我有一个 TabItem 其中包含一个日历控件和一个按钮 问题是 当日历的选择日期与先前选择的日期相同时 该按钮需要单击两次才能触发其 Click 事件 我实现了日历的 selectedDatesChanged 事件来解决当当前选择的日期与
  • 应用程序启动时将焦点设置在 PasswordBox 上

    我无法将焦点设置在我的 PasswordBox 控件上是否有原因 C public Login InitializeComponent password Focus XAML
  • Visibility = IsCollapsed 是否跳过数据绑定部分?

    如果我将 StackPanel 或任何绑定区域设置为 折叠 数据会加载吗 它会触发它的 Loaded 事件吗 Yes 您的数据绑定将被评估 您的初始化事件将会触发 并且 您的 Loaded 事件将会触发 但在视觉树的部分中Visibilit
  • Microsoft.Windows.Design.dll

    我下载了库 DynamicDataDisplay 其源代码 某些项目需要 Microsoft Windows Design dll 文件 我在哪里可以得到它 我搜索过它 但它不存在于我的硬盘上 如果您有 Visual Studio 等 则应
  • Visual Studio 2010 解决方案的 MSBuild 命令行执行无法引用 VS2010 SDK 来构建扩展

    Scenario 包含 VS2010 扩展的解决方案 NET 4 类库 带有 WPF UI 它在视觉工作室内部构建得很好 On the 同一台机器当我尝试通过命令行构建它时 作为构建脚本的一部分 Fails when using this
  • 为什么有时Task明显慢于Thread?

    我正在使用 MVVM 模式制作 WPF 应用程序 我发现有时任务明显慢于线程 例如 在测试 ViewModel 中 public void DoSomething Stopwatch stopwatch Stopwatch StartNew
  • MVVM 在 ASP.NET MVC 4 Web 应用程序中扮演什么角色?

    当我正在阅读 ASP NET MVC 4 这本书时 我对 MVVM 感到好奇 我开始谷歌搜索 找不到任何关于使用 MVVM 开发 Web 应用程序的书籍 所以我一定在这里遗漏了一些信息 据我了解 MVVM是通过knockout js和其他框
  • 为什么我的窗口没有被垃圾收集?

    我有一个标准的 CRUD 应用程序 可以处理相当大量的数据 不同的窗口使用 Linq To SQL 访问不同的表 每个窗口本质上都有一个网格 其中的单元格绑定到我正在显示的对象 这是正在发生的事情的一个非常标准的用例 打开窗口A 关闭窗口
  • WPF 中的图像变得模糊

    我正在使用 C 在 WPF 中开发应用程序 我将图像放入 WrapPanel 中 并在带有一个边框的网格内显示 并在按钮中使用图像 问题是我的图像控件失去了质量 我无法在这里发布我的图片 所以我只是在这里描述 I used SnapsToD
  • WPF DataGrid 绑定到 string.Length 而不是字符串文本

    我是 WPF 的新手 并且真诚地尝试自己尽可能多地弄清楚 我已经创建了第一个 DataGrid 控件 并且尝试使用如下字符串列表填充它
  • 读取WPF应用程序的程序集版本信息

    我正在阅读我的 wpf 应用程序的版本信息 但我没有得到我所写的正确版本AssemblyInfo cs文件 我的文件中有 assembly AssemblyVersion 0 1 001 assembly AssemblyFileVersi
  • SpeechSynthesizer 中的持续内存泄漏

    我开发了一个项目 我想发布它使用 c WPF 和 System Speech Synthesizer 对象 阻止该项目发布的问题是 每当调用 SpeakAsync 时 都会留下内存泄漏 并最终导致失败 我相信在使用这个物体后我已经正确清理了
  • 从程序集中加载 ResourceDictionary

    我在文件系统的某个地方有一个程序集 例如 C temp test dll 在该程序集中有一个 ResourceDictionary 例如 abc xaml 我怎样才能获得该资源字典 也许有一种使用反射的方法 到目前为止我还没有找到解决方案
  • 将 SQL 数据库附加到 ComboBox.ItemSsource (WPF)

    我想知道如何将 SQL Server 数据库分配给 ComboBox 的 ItemSource 属性 在 WPF 应用程序中 我将数据源分配给项目 但不知道如何分配给属性 此致 你可以这样尝试 你可以像下面这样绑定组合框的项目源属性 Ite
  • 如何使WPF TreeView风格成为WinForms TreeView?

    WPF 默认的 TreeView 非常好 我仍然希望它有连接每个子元素的线 就像 Windows 窗体 TreeView 一样 我在网上搜索了一些例子 但设计得不够好 我怎样才能用WPF实现它 让我回答我自己的问题 Code 您需要做的只是

随机推荐

  • 如何将数据库上传到 Heroku

    我有一个共享的heroku应用程序 现在我不想使用相同的代码在heroku中创建一个测试应用程序 所以我创建了一个新的应用程序 好的 问题是要使该应用程序正常工作 它需要一个数据库 所以我正在尝试上传本地数据库 但不知道如何上传 谁能告诉我
  • 如何在 条目中获取红色星号

    如何在条目中添加红色星号 以便可以将其显示在文本末尾以指示其为必填字段 例如 输入您的姓名 星号将为红色 或者 就此而言 文本中的任何位置 您无法通过 xml 字符串资源来做到这一点 这只能通过代码来完成 为此 您需要使用Spannable
  • 将 mysql 跳过网络设置为关闭

    我正在尝试设置我的 Ubuntu 12 10 服务器以接受远程 mysql 连接 但是我在将跳过网络设置为关闭时遇到困难 注意我已经将绑定地址设置为面向互联网的 IP 而不是 127 0 0 1 当我查看 etc mysql my conf
  • jQuery.parseJSON 与 JSON.parse

    jQuery parseJSON and JSON parse是执行相同任务的两个函数 如果 jQuery 库已经加载 将使用jQuery parseJSON比使用更好JSON parse 在性能方面 如果是 为什么 如果不是 为什么不呢
  • 如何使用 Python 高效解析电子邮件而不触及附件

    我正在使用 Python imaplib Python 2 6 从 GMail 获取电子邮件 我用方法获取电子邮件的所有内容http docs python org library imaplib html imaplib IMAP4 fe
  • CSS 悬停与 JavaScript 鼠标悬停 [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 有时我需要选择使用 CSS element hover 还是 JavaScript onmouseover 来控制页面上 html 元素的外观 考虑以下场景 其中 div 包装输入 div
  • SVG 图像在 IE9 中不会被裁剪

    以下代码 div style border solid 1px black height 100px width 100px div
  • Scala:合并地图

    如何合并地图 如下所示 Map1 Map 1 gt Class1 1 2 gt Class1 2 Map2 Map 2 gt Class2 1 3 gt Class2 2 合并后 Merged Map 1 gt List Class1 1
  • 空列表到可见性转换器

    我正在尝试为 WPF 做一个 空列表到可见性转换器 这是一个 IValueConverter 它接受一个对象 应该是一个列表 如果列表为空 或者传递的对象为 null 它应该返回 Visibility Collapsed 如果列表不为空 则
  • 迄今为止的 Swift ISO8601 格式

    我有以下字符串 20180207T124600Z 如何将其转换为 Date 对象 这是我当前的代码 但它返回nil let dateString 20180207T124600Z let dateFormatter ISO8601DateF
  • Spring Web 响应式客户端

    我正在尝试使用 Spring Reactive WebClient 将文件上传到 spring 控制器 控制器非常简单 如下所示 PostMapping value upload consumes MediaType MULTIPART F
  • Azure DevOps REST api - 使用变量运行管道

    我在 Azure Devops 上有一个管道 我尝试使用 REST api 以编程方式 无头运行 https learn microsoft com en us rest api azure devops pipelines runs ru
  • 从嵌入 iframe 代码获取 YouTube 视频 ID

    我想使用 preg match 或正则表达式从 YouTube 嵌入代码获取 YouTube 视频 ID 举个例子 我要拿身份证0gugBiEkLwU 谁能告诉我该怎么做 真的很适合你的帮助 将此模式与捕获组一起使用应该会为您提供所需的字符
  • 我的 onNewIntent 没有调用

    创建一个集成 Twitter 的应用程序 我使用这个教程 http blog blundell apps com sending a tweet package com blundell tut ttt import android app
  • 访问事件以从源自标签 onclick 属性的自定义函数调用 Preventdefault

    我有这样的链接 a href a click a href a click 我想做一个preventDefault inside myfunc 因为一个 单击链接时将添加到地址栏中 不做return false or href javasc
  • C# 2010,ODP.net,调用存储过程传递数组

    我有一个需要 4 个输入的 PL SQL 存储过程 这些输入之一是关联数组 Oracle 类型 PLS INTEGER 索引的 VARCHAR2 1 表 我想要一个 C 程序 使用正确的输入 包括关联数组 调用此存储过程 我将 ODP ne
  • pip3 install PyQt5 --用户失败[重复]

    这个问题在这里已经有答案了 尝试通过 pip3 安装 PyQt5 时出现错误 自动消息要求我添加更多详细信息 但我没有 所有细节都在代码中 pip3 install PyQt5 user Collecting PyQt5 Retrying
  • 在 PHP 中包含整个目录或在 PHP Include 中使用通配符?

    我有一个 php 命令解释器 它位于命令目录内 需要访问命令文件中的每个命令 目前我对每个命令调用一次 require require once CommandA php require once CommandB php require
  • 将 minSdkVersion 从 16 更改为 26,版本 APK 大小从 17 MB 增加到 39 MB

    我有一个相对较小且简单的应用程序 它始终生成约 17 MB 的发布 APK 文件 不久前 我注意到 APK 大小增加到了惊人的 对于这个应用程序 39 MB 我追踪了导致它的更改 结果发现相同的代码库 唯一的更改是minSdkVersion
  • WPF MVVM TreeView 选定项

    这不可能这么困难 WPF中的TreeView不允许设置SelectedItem 说该属性是ReadOnly 我填充了 TreeView 甚至在数据绑定集合更改时进行更新 我只需要知道选择了什么项目 我正在使用 MVVM 因此没有代码隐藏或变