WPF 控件是否在其绑定中使用弱事件?

2024-03-24

当我在 WPF 中使用数据绑定时,我的目标控件正在侦听绑定源上的事件。例如,我可能有一个ListView http://msdn.microsoft.com/en-us/library/system.windows.controls.listview.aspx倾听CollectionChanged http://msdn.microsoft.com/en-us/library/system.collections.specialized.inotifycollectionchanged.collectionchanged.aspx上的事件ObservableCollection http://msdn.microsoft.com/en-us/library/ms668604.aspx.

如果事件源的生命周期预计会超过事件侦听器的生命周期,则存在潜在的内存泄漏,并且弱事件模式 http://msdn.microsoft.com/en-us/library/aa970850.aspx应该使用。

WPF 数据绑定是否遵循弱事件模式?如果我的ObservableCollection比我的寿命长ListView,我的ListView被垃圾收集吗?


这就是为什么我怀疑 WPF 控件没有实现弱事件模式。如果他们这样做,我希望两者都DerivedListView Collected! and DerivedTextBlock Collected!输出到控制台。相反,仅DerivedTextBlock Collected!是。

修复代码中的错误后,这两个对象都会被收集。我不知道该怎么想。

Window1.xaml.cs

using System;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Controls;

namespace LeakDetector
{
    public class DerivedListView : ListView
    {
        ~DerivedListView()
        {
            Console.WriteLine("DerivedListView Collected!");
        }
    }

    public class DerivedTextBlock : TextBlock
    {
        ~DerivedTextBlock()
        {
            Console.WriteLine("DerivedTextBlock Collected!");
        }
    }

    public partial class Window1 : Window
    {
        // The ListView will bind to this collection and listen for its
        // events. ObColl will hold a reference to the ListView.
        public ObservableCollection<int> ObColl { get; private set; }

        public Window1()
        {
            this.ObColl = new ObservableCollection<int>();
            InitializeComponent();

            // Trigger an event that DerivedListView should be listening for
            this.ObColl.Add(1);

            // Get rid of the DerivedListView
            this.ParentBorder.Child = new DerivedTextBlock();

            GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
            GC.WaitForPendingFinalizers();
            GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);

            this.ParentBorder.Child = null;

            GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
            GC.WaitForPendingFinalizers();
            GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);

            Console.WriteLine("Done");
        }
    }
}

窗口1.xaml

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:LeakDetector"
    x:Class="LeakDetector.Window1"
    DataContext="{Binding RelativeSource={RelativeSource Self}}"
    Height="300" Width="300"
    Title="Leak Detector">
    <Border x:Name="ParentBorder">
        <local:DerivedListView ItemsSource="{Binding Path=ObColl}" />
    </Border>
</Window>

本质上,WPF 控件本身与弱事件没有任何关系。相反,有一些与 WPF 绑定引擎相关的类实现了弱事件模式。班上属性更改事件管理器 http://msdn.microsoft.com/en-us/library/system.componentmodel.propertychangedeventmanager.aspx实现WeakEventManager。如果您使用 Reflector,您将看到几个类在 MS.Internal.Data 命名空间中实现 IWeakEventListener(特别是 MS.Internal.Data.PropertyPathWorker 类,它直接使用 PropertyChangedEventManager)。 WPF 在内部使用这些对象来执行数据绑定。

ItemsControls 和 CollectionChanged 事件是一个不同的故事,与 Bindings 无关。看,您可以在后面的代码中执行类似“listView.ItemsSource = myObservableCollection”的操作,并且集合更改通知仍然有效。这里根本不涉及 Binding 对象。这里,一组不同的“弱事件相关类”正在发挥作用。物品收藏 http://msdn.microsoft.com/en-us/library/system.windows.controls.itemcollection.aspx and 项目容器生成器 http://msdn.microsoft.com/en-us/library/system.windows.controls.itemcontainergenerator.aspx实现 IWeakEventListener,并且它们与集合更改事件管理器 http://msdn.microsoft.com/en-us/library/system.collections.specialized.collectionchangedeventmanager.aspx(它实现了 WeakEventManager)。

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

WPF 控件是否在其绑定中使用弱事件? 的相关文章

  • 如何在 WPF 应用程序中实现气球消息

    我们想使用气球消息 如UX Guide http msdn microsoft com en us library aa511451 aspx来自微软 我发现一些示例使用 Windows 窗体中的本机代码 但本机代码需要组件的句柄 这对于
  • WPF。如何从另一个窗口隐藏/显示主窗口

    我有两个窗口 MainWindow 和 Login 显示登录的按钮位于主窗口 this Hide Login li new Login li Show 登录窗口上有一个检查密码的按钮 如果密码正确 我如何显示主窗口 将参数传递给 MainW
  • 如何在 Oxyplot 中显示折线图的绘图点?

    这是我的图表的 xaml 代码
  • 创建面向鼠标和触摸的 WPF 应用程序的最佳实践[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • C# - 继承WPF布局 - Window from Window

    我的 Window 继承有问题 我不明白问题是什么 我认为 我的布局 MediaLibrary xaml 必须继承 MainWindow 但我不知道该怎么做 有2类 主窗口 xaml
  • 在简单注入器中解析具有自定义参数的类

    我正在使用以下命令创建 WPF MVVM 应用程序简易注射器作为 DI 容器 现在 当我尝试从简单注入器解析视图时遇到一些问题 因为我需要在构造时将参数传递到构造函数中 而不是在将视图注册到容器时 因此这不是适用的 简单注入器将值传递到构造
  • 如何更改 TextBox.Text 而不丢失 WPF 中的绑定?

    在 WPF 应用程序中 我正在创建一个设置窗口来自定义键盘快捷键 在文本框中 我处理 KeyDown 事件并将 Key 事件转换为人类可读的形式 以及我想要获取数据的形式 文本框声明如下
  • 不支持 URI 前缀

    我正在尝试使用以下方法加载和播放波形文件 SoundPlayer simpleSound new SoundPlayer pack application MyAssembly component Sounds 10meters wav s
  • WPF 中处理系统关闭

    如何在 WPF 中重写 WndProc 当我的窗口关闭时 我尝试检查我正在使用的文件是否被修改 如果是 我必须提示用户 你想保存更改吗 消息 然后关闭正在使用的文件和窗口 但是 当我的窗口仍然打开时 我无法处理用户重新启动 关闭 注销的情况
  • 如果在代码中添加元素,“FindName”将不起作用

    在 WPF 应用程序中 如果在 XAML 中声明 ContentControl
  • 如何对 Prism / MEF 中的 ItemsControl 中的视图进行排序?

    我使用 prism v4 和 MEF 来加载我的模块 我的模块包含一些视图 MVVM 这些视图由 MEF 自动加载到 ItemsControl NavigationRegion 中 这很好用 所有项目都显示在 ItemControl 中 但
  • 增加 WPF 弹出动画的持续时间

    我有一个 WPF PopUp 控件 用于显示菜单叠加层 并且使用默认的淡入淡出动画 不过我想让动画需要更长的时间才能完成 我可以在 XAML 中做到这一点吗 你能在这里发布相关的xaml代码吗 否则 您可以查看这些链接以开始使用 xaml
  • 如何创建向后兼容 Windows 7 的缩放和尺寸更改每显示器 DPI 感知应用程序?

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

    我正在尝试绑定一个Enum to a ComboBox 我见过很多人使用ObjectDataProvider但我似乎无法访问它 我还注意到有些人在一段时间内使用它Window Resources 而不是Page Resources但我找不到
  • 如何在MVVM中管理多个窗口

    我知道有几个与此类似的问题 但我还没有找到明确的答案 我正在尝试深入研究 MVVM 并尽可能保持纯粹 但不确定如何在坚持模式的同时启动 关闭窗口 我最初的想法是向 ViewModel 发送数据绑定命令 触发代码来启动一个新视图 然后通过 X
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • 使用 DataBindingComponent 的 Inflate 方法

    当 Glide 成功渲染图像后 我在更新文本视图时看到此错误 致命异常 java lang IllegalStateException 必需 CustomBinding 类中的 DataBindingComponent 为 null 绑定适
  • 当其他列子项折叠时调整 WPF 网格列的大小?

    我有两个控件Grid 并且需要制作一个来填充所有Grid另一个获得后的空间Collapseded 我不知道什么Container我可以使用吗 我试过了StackPanel and DockPanel我也是 但找不到好的解决方案 这是我的代码
  • WPF 错误:属性元素不能位于元素内容的中间。它们必须位于内容之前或之后

    我有一个MergedDictionaries and DateTemplate里面一个ResourceDictionary一切都很好 直到我添加了一个Converter
  • 如何将文本放在 RadioButton 的顶部

    我正在尝试实现附件中显示的效果 但没有成功 甚至有可能吗 我试图将文本框放在单选按钮内 并将其设置为水平和垂直内容对齐 但它没有按我想要的方式工作 欢迎任何建议 Resource

随机推荐

  • R,迭代矩阵的行向量

    我有一些向量vect我想迭代行向量v的矩阵并计算 cov v vect I tried for vect in mat2 where mat2 is a 215 by 31 matrix 然而 每个向量似乎都是值为 1 的标量 如何迭代矩阵
  • 为什么在使用 setRequestHeader 发出 xmlhttprequest 时无法设置 cookie 和 set-cookie 标头?

    我想知道为什么不能设置cookie使用 setRequestHeader 来设置标头 是否有任何特定原因或只是它们是由浏览器本身添加的 因此这些标头被禁用 是否存在安全问题 Edit 我正在使用 Node js 并使用xmlhttprequ
  • 从上到下 - 翻译动画

    需要制作下一个动画 在android 2 2及以上版本 1 从上到下移动按钮 点击他后 2 从下往上移动 再次点击他后 第一个动画工作正常 但第二个动画不行 btn 从下到上 跳跃 并且没有动画 Code public class Main
  • Javascript keyup 无法按预期工作,它会在我没有将手指从按钮上移开的情况下执行

    我正在尝试用 javascript 创建一个简单的游戏 但我陷入了如何处理按键的困境 小例子 function keyUpEvent event alert event keyCode window addEventListener key
  • 使用 Scipy/python 寻找峰值的算法

    我有随机数据 在其中绘制了图表以查找源自零的峰值我使用了此代码 op col for i in df Speed op col append i print op col 使用 for 循环将 速度 值转换为一维数组 0 7 18 24 2
  • VB.Net 中接口中定义的属性的受保护集

    我们有一个界面 可以大大简化为 public interface IPersistable
  • CSS3 缩放变换和溢出问题:在 Safari 上隐藏

    我在 Safari 上遇到缩放变换效果和溢出问题 当我在 div 内容上使用此效果时 溢出在圆形容器上不起作用 这是我的代码 container width 100px height 100px border radius 50 backg
  • Visual Studio 2010 工具箱为空

    我有 Visual Studio 2010 Professional 但不知何故我的工具箱几乎空了 我有 报告 ReportViewer Visual Basic 电源包 a few basic items like line and ov
  • 如何在表单对话框中接收附件?

    我目前有一个机器人对话框 它请求并接收用户的附件 我想将其转换为表单对话框 因为我认为这更适合 请向我发送文档1 直到文档N 您能给我指出一个接收用户附件的表单对话框的示例吗 我读到 FormFlow 现在支持附件 https github
  • node-postgres 是否支持多个结果集

    我有一个返回多个结果集的 PostgresQL 函数 我可以毫无问题地在 net 中提取这些结果集 所以我知道我的函数可以正常工作 但我在使用 node postgres 时遇到了麻烦 结果对象返回一个包含 7 个项目的数组 该数组与返回的
  • 更改 Kubernetes docker-for-desktop 集群网络 ip

    我正在尝试在 docker for desktops 上配置 Kubernetes 并且想要更改分配给容器的默认网络 示例 默认网络是10 1 0 0 16但我想要172 16 0 0 16 I changed the docker net
  • 无法在 ViewComponent 中加载脚本

    我创建了一个ViewComponent其中显示一个Table需要一些插件来启用特定功能 在 的里面ViewComponent我尝试创建一个特定的部分 section DataTableScripts 不幸的是我发现一个ViewCompone
  • 复制和区分表单的各个部分

    更新 使用colecmc提供的代码 谢谢 我更新了codepen 我喜欢添加 date now 的方式 但我只想增量增加 我不确定如何将其应用到这个函数中 我尝试了 zer00ne 的索引增量 但我做错了 let cloneList ind
  • 在 jenkins 中完全跳过执行 shell 步骤

    我似乎无法在 Jenkins 中运行构建执行 shell 步骤 我过去曾在 Windows 上与 Hudson 合作 并且能够毫无问题地创建 shell 批处理步骤 但我似乎在这里遗漏了一些东西 这是一个全新的 jenkins 安装 我进入
  • 为什么 PHP 错误打印两次?

    Summary 令人惊讶的是我在谷歌或SO上找不到任何关于此的信息 当我在 PHP 中引发异常时 它会在我的控制台中出现两次 并包含错误消息和堆栈跟踪 第一次打印时显示 PHP Fatal error 第二次打印时仅显示 Fatal err
  • “用户正在输入消息”功能...?

    只是要指出 我指的是用 PHP jQuery 编写的聊天系统 您可以在底部看到 用户正在输入消息 我尝试了很多方法来完成它 但都失败了 我构建了自己的用 PHP MySQL Ajax jQuery 编写的聊天系统 我并不是要求某人为我编写该
  • 使用 Excel 宏 VBA 在 Excel 范围内查找行的最快方法

    我有一个 Excel 电子表格 sheet2 其中记录的数量约为 100 万条 我正在迭代这些记录 并且对于每次迭代 我都会将一行选定的列与sheet1 中大约2000 条记录的另一个范围进行比较 rangeA 1 Million rows
  • 在 Ember-CLI 内升级 Ember

    我刚刚创建了一个新的Ember CLI http www ember cli com app v0 1 12 并注意到 Ember 的引用版本是 v1 8 1 bower json 我想得到最近发布了1 10 http emberjs co
  • 在scala中使用正则表达式提取字符串

    我有一个用例 我想从 scala 的输入中提取某些字符串 我的输入字符串看起来像 asdwf ssdf as232 ss ABC xxx sdfsf234 sdaf 我想提取xxx after ABC 我尝试定义正则表达式匹配模式 val
  • WPF 控件是否在其绑定中使用弱事件?

    当我在 WPF 中使用数据绑定时 我的目标控件正在侦听绑定源上的事件 例如 我可能有一个ListView http msdn microsoft com en us library system windows controls listv