gpt4 book ai didi

WPF:绑定(bind)实际发生在什么时候?

转载 作者:行者123 更新时间:2023-12-04 21:05:38 27 4
gpt4 key购买 nike

我的 MVVM 应用程序有许多从基本用户控件继承的 View ,这些控件公开了一个“ID”属性。在 XAML 中,这绑定(bind)到 View 的基础 View 模型上的 ID 属性,简单地说:

Id="{Binding Path=Id}"

View 模型实现了 INotifyPropertyChanged,它的 ID 在构造函数中设置。 ID 用于唯一标识每个 View / View 模型,主要由“桌面管理器”用于管理主窗口中的用户控件,就像 MDI 应用程序一样。当我的应用程序启动时,我实例化各种 View 模型及其 View ,并将 View 模型分配给 View 的 DataContext .然后我将 View 传递给桌面管理器,桌面管理器将它们放置在 Canvas 上,定位它们等。

我遇到的问题是,此时 View 的 ID 仍然为空,并且似乎只是在一段时间后才绑定(bind)到数据上下文(也许当 UI 被渲染时?)。我试过像这样强制绑定(bind),但它没有帮助: -
var bindingExpression = widget.GetBindingExpression(DesktopElement.IdProperty);
bindingExpression.UpdateTarget();

这不是世界末日,因为我可以将我的 View 和 View 模型中的 ID 传递给桌面管理器,但感觉有点 hacky。我很想知道绑定(bind)发生在控件/窗口生命周期的哪个时间点,以及是否有其他方法可以强制绑定(bind)发生?

提前致谢
安迪

最佳答案

为了了解绑定(bind)是如何传输的,您需要了解 Dispatcher .基本上,它是一个优先队列。布局、绑定(bind)、渲染、输入等内容以不同的优先级放置在队列中。

现在,从它的声音来看,你永远不会让执行返回到 Dispatcher。 .这意味着 Binding值无法传输(当您手动调用 UpdateTarget 时,您只是在 Dispatcher 上安排此操作)。所以,简而言之,你需要让 Dispatcher在完成初始化之前执行排队的操作。

最简单的方法是调用BeginInvoke低于 DispatcherPriority关于完成初始化的方法。由于布局系统的工作原理,有时选择正确的优先级可能会很棘手,但如果您使用 DispatcherPriority.Loaded 可能会没问题。 .

关于WPF:绑定(bind)实际发生在什么时候?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10931061/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com