WPF:PropertyChangedCallback 仅触发一次

2023-11-24

我有一个用户控件,它公开一个名为 VisibileItems 的 DependencyProperty 每次更新该属性时,我都需要触发另一个事件。 为了实现这一点,我添加了带有 PropertyChangedCallback 事件的 FrameworkPropertyMetadata。

由于某种原因,此事件仅被调用一次,并且下次 VisibleItems 更改时不会触发。

XAML:

<cc:MyFilterList VisibleItems="{Binding CurrentTables}"  />

CurrentTables 是 MyViewModel 上的 DependencyProperty。 CurrentTables 经常更改。我可以将另一个 WPF 控件绑定到 CurrentTables,并且可以看到 UI 中的更改。

这是我将 VisibleItems 与 PropertyChangedCallback 连接的方式

public static readonly DependencyProperty VisibleItemsProperty =
    DependencyProperty.Register(
    "VisibleItems",
    typeof(IList),
    typeof(MyFilterList),
    new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender, new PropertyChangedCallback(VisiblePropertyChanged))

    );

public IList VisibleItems {
    get { return (IList)GetValue(VisibleItemsProperty); }
    set { SetValue(VisibleItemsProperty, value); }
}

通过进入 Visible PropertyChanged,我可以看到它在第一次设置当前表时被触发。但随后的时间就不会了。

UPDATE

正如你们中的一些人质疑 CurrentTables 的修改方式一样,它在更改时完全重新分配:

OnDBChange()...
CurrentTables = new List<string>(MainDatabaseDataAdapter.GetTables(this.SelectedServer, this.SelectedDatabase));

每次更改都会调用此行,但我的 VisiblePropertyChanged 处理程序仅在第一次时被调用。

UPDATE

如果我直接分配 VisibleItems,处理程序每​​次都会被调用!

TestFilterList.VisibleItems = new List<string>( Enumerable.Range(1, DateTime.Now.Second).ToList().Select(s => s.ToString()).ToList() );

因此,问题似乎源于 DependencyProperty (VisibleItems) 监视另一个 DependencyProperty (CurrentTables)。不知何故,绑定适用于第一个属性更改,但不适用于后续属性更改? 正如你们中的一些人所建议的,尝试用窥探来检查这个问题。


您是否为也具有以下属性的依赖项属性设置“本地”值(即直接分配给依赖项属性设置器)OneWay绑定在上面吗?如果是这样,设置本地值将删除绑定,如上所述MSDN 依赖属性概述:

绑定被视为本地值,这意味着如果您设置另一个本地值,您将消除绑定。

当依赖属性机制被要求在依赖属性上存储本地值时,它没有太多其他可以做的事情。它无法通过绑定发送值,因为绑定“指向”错误的方向。设置为本地值后,它不再显示从绑定获得的值。由于它不再显示绑定的值,因此它删除了绑定。

一旦绑定消失,PropertyChangedCallback当绑定的源属性更改其值时,将不再被调用。这可能就是回调未被调用的原因。

如果您将绑定设置为TwoWay,绑定系统确实有地方可以存储您设置的“本地”值:在绑定的源属性中。在这种情况下,无需消除绑定,因为依赖属性机制可以将值存储在源属性中。

这种情况不会导致堆栈溢出,因为会发生以下情况:

  • 依赖属性接收“本地”值。
  • 依赖属性机制沿着与源属性的绑定“向后”发送值,
  • 源属性设置属性值并触发PropertyChanged,
  • 依赖属性机制接收PropertyChanged事件,检查源属性的新值,发现它没有更改,并且不执行任何进一步操作。

这里的关键点是,如果你发射一个PropertyChanged属性事件其值没有改变, any PropertyChangedCallback绑定到您的属性的依赖属性上的 s 将不会被调用。

为了简单起见,我忽略了IValueConverters在上面。如果您有转换器,请确保它能够正确地双向转换值。我还假设另一端的属性是实现的对象上的视图模型属性INotifyPropertyChanged。绑定的源端可能存在另一个依赖属性。依赖属性机制也可以处理这个问题。

碰巧的是,WPF(和 Silverlight)不包含堆栈溢出检测。如果,在一个PropertyChangedCallback如果您将依赖属性的值设置为与其新值不同(例如,通过递增整数值属性或将字符串附加到字符串值属性),则会出现堆栈溢出。

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

WPF:PropertyChangedCallback 仅触发一次 的相关文章

随机推荐

  • 如何获取 mscorlib.ni.lib (.Net Framework 3.5) 的 PDB 文件

    经过大量搜索后 我仍然无法找到该问题的解决方案 我有一个 mdmp 文件 调用堆栈显示它正在使用 mscorlib ni dll 因此 要获取函数信息 我需要获取其 pdb 文件 mscorlib ni dll的版本是2 0 50727 3
  • FullCalendar - 图像作为事件

    希望使用完整日历并将图像包含为事件和可拖动 简而言之 很想看看这个例子如何https fullcalendar io js fullcalendar 3 0 1 demos external dragging html将使用小缩略图而不是文
  • JAVA 中带有 JSON 字符串的 HTTP POST 请求

    我必须使用我已经生成的 JSON 字符串发出 http Post 请求 我尝试了两种不同的方法 1 HttpURLConnection 2 HttpClient 但我从他们两个那里得到了同样的 不想要的 结果 到目前为止我的代码HttpUR
  • TextEncodings.Base64Url.Decode 与 Convert.FromBase64String

    我正在致力于创建一种生成 JWT 令牌的方法 该方法的一部分从我的 web config 中读取一个值 该值作为 秘密 用于生成用于创建 JWT 令牌签名的哈希值
  • 删除 Firestore 集合中的所有文档

    我正在寻找一种方法来清除整个集合 我看到有一个批量更新选项 但这需要我知道集合中的所有文档 ID 我正在寻找一种方法来简单地删除集合中的每个文档 Edit 下面的答案是正确的 我使用了以下内容 func delete collection
  • mongodb打开连接问题

    我的 mongo 控制台中有以下日志 Tue Jul 23 17 20 01 301 initandlisten waiting for connections on port 27017 Tue Jul 23 17 20 01 401 w
  • 如何删除 VB.NET 中的事件处理程序[重复]

    这个问题在这里已经有答案了 可能的重复 VB NET RemoveHandler 和匿名方法 如果我添加这样的事件处理程序 AddHandler s Click AddressOf Panel1 Click 我怎样才能删除事件处理程序 Pr
  • Apache 2.4.37 与 openssl 1.1.1:无法执行握手后身份验证

    我将 apache 更新到最新版本 2 4 37 将 openssl 更新到 1 1 1 现在 当客户端进行身份验证时 我仅在 Firefox 63 中收到此错误 但在 Chrome 中则不会 ssl error AH verify cli
  • 使用子模块将 Git 推送到 azure 网站

    到目前为止 我已经通过 Git 将站点发布到 Windows Azure 网站 没有出现任何问题 但今天我们向项目添加了一个子模块 而 Azure 似乎不喜欢使用子模块 构建失败 因为我的应用程序依赖于子模块 而 Azure 看到的是空文件
  • 如何使用 get_posts 获取大于 X (ID) 的帖子

    args array numberposts gt 10 tag gt my tag ID gt 555 posts get posts args 我只想从特定标签中获取 10 条记录 并且 ID 小于数字 有没有办法用 get posts
  • 如何 $watch 指令中的多个内插属性?

    我不明白如何在链接函数中同时监视多个属性 因此我创建了一个包含所有参数的对象并监视它 但我注意到链接函数中的属性是一个字符串而不是一个对象 所以我使用 angular fromJson val 我发现的所有示例都只使用一个参数 您能解释一下
  • Symfony2 没有要处理的元数据类

    创建实体后 php app console doctrine generate entity 并在使用时 php app console doctrine schema update force 我遇到过 没有要处理的元数据类 Entity
  • 相对于 HTML 中的绝对路径

    我需要通过 URL 创建新闻通讯 为此 我 创建一个WebClient 使用WebClient的方法DownloadData获取字节数组中的页面源 从 source html 字节数组中获取字符串并将其设置为新闻通讯内容 但是 我在路径方面
  • PostSharp后pdb文件丢失

    我正在使用 PostSharp 版本 2 1 6 4 也尝试了最新版本 2 1 7 35 有时 pdb 文件丢失 并且其中有一个 pssym 文件
  • 拥有 SQLite 和多个表的自己的 ContentProvider

    我在读本教程关于实现我自己的 ContentProvide 以使用 SQLite 在 ContentProvider query 中 有一些事情让我困惑 它似乎非常硬编码为一张表 教程中的待办事项表 但也许我只是不明白 现在 如果我想查询另
  • Python-删除旧文件

    我对 python 有点陌生 一直在尝试自己解决这个问题 但到目前为止只得到了一些零碎的东西 基本上 我正在寻找一个脚本 它将递归搜索目录及其子目录 并删除至少 24 小时前的文件 但不会更改目录 非常感谢任何建议或示例 这使用了os wa
  • jQuery 真正支持哪些 CSS3 选择器,例如:第n个最后一个孩子()?

    根据http api jquery com category selectors 我们可以在 jQuery 中使用大量的 CSS 选择器 但是例如 nth last child 那里没有提到 然而 当我测试以下内容时 使用来自 Google
  • 生成固定长度整数分区的所有唯一排列的算法?

    我正在寻找一种生成整数固定长度分区的所有排列的算法 顺序并不重要 例如 对于 n 4 且长度 L 3 0 2 2 2 0 2 2 2 0 2 1 1 1 2 1 1 1 2 0 1 3 0 3 1 3 0 1 3 1 0 1 3 0 1 0
  • 单个 Git 存储库中的公共和私有代码

    我参与的一个研究小组目前将所有代码托管在一个私有 SVN 存储库中 我们想开放我们的代码并将大部分代码移至 Github 上 问题是 有些代码是敏感的 不应该开放 但我们仍然希望它处于版本控制之下 目前 我们在 Github 上有开放代码
  • WPF:PropertyChangedCallback 仅触发一次

    我有一个用户控件 它公开一个名为 VisibileItems 的 DependencyProperty 每次更新该属性时 我都需要触发另一个事件 为了实现这一点 我添加了带有 PropertyChangedCallback 事件的 Fram