我有一个 ItemsControl 控件。在它的项目中,我展示了很多东西:图像、文本 block 等。
我在 itemscontrol 上实现了“搜索”功能 - 这意味着如果用户从键盘输入一些字母,items 控件将被刷新。我的搜索方法位于代码隐藏中,并且需要不到一秒钟的时间。然而,我输入字母和看到结果之间的时间是 3-4 秒。我有一个窗口关闭命令,我想将其放在显示搜索结果之前的确切时刻。如果我将此命令放在搜索方法的末尾(在代码隐藏中),则关闭窗口和显示项目之间仍然有几秒钟的延迟。我认为绑定(bind)很慢,这就是为什么我需要捕获绑定(bind)完成时调用的事件。 WPF中有这样的事件吗?
OnPropertyChanged 事件在搜索方法完成之前被调用,因此这对我没有帮助。
我还尝试了 OnDataContextChanged 事件,但它只被调用一次 - 当控件初始化时。当用户输入字母并发生新绑定(bind)时,我还需要调用它。
最佳答案
当您在 WPF 中的源属性和目标依赖属性之间建立数据绑定(bind)时,此 Binding
实际上翻译成BindingExpression
对象,它负责在适当的时刻更新源和目标的繁重工作。
不幸的是,BindingExpression
更新某些内容时不提供事件,如您在此处看到的:http://msdn.microsoft.com/en-us/library/system.windows.data.bindingexpression(v=vs.110).aspx
唯一的方法是设置 UpdateSourceTrigger
至Explicit
当您定义绑定(bind)时,在后面的代码中获取绑定(bind)表达式并手动更新源和目标 - 然后您就可以完全控制并可以在此场景中封装常用功能。
您可以获得BindingExpression
通过使用BindingOperations.GetBindingExpression
静态方法:http://msdn.microsoft.com/en-us/library/system.windows.data.bindingoperations.getbindingexpression(v=vs.110).aspx
如果您还有任何疑问,请随时提问。
PS:难道没有其他方法可以做到这一点吗?如果您使用的是绑定(bind)到 ItemsControl
的源集合,您不能对源集合执行搜索/过滤操作并让集合绑定(bind)更新您的 ItemsControl
?
关于wpf - 控件完成绑定(bind)时调用的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25527958/