Wpf 控件完成绑定时调用的事件

Wpf 控件完成绑定时调用的事件,wpf,events,data-binding,Wpf,Events,Data Binding,我有一个ItemsControl控件。在它的项目中,我展示了很多东西:图像、文本块等等 我在itemscontrol上实现了“搜索”功能,这意味着如果用户从键盘输入一些字母,items控件将被刷新。我的搜索方法是代码隐藏的,只需不到一秒钟。但是,我输入字母和查看结果之间的时间是3-4秒。我有一个窗口关闭命令,我想把它放在显示搜索结果之前的确切时刻。如果我将此命令放在搜索方法的末尾(在代码隐藏中),则在关闭窗口和显示项目之间仍有几秒钟的延迟。我认为绑定很慢,这就是为什么我需要捕获绑定完成时调用的事

我有一个ItemsControl控件。在它的项目中,我展示了很多东西:图像、文本块等等

我在itemscontrol上实现了“搜索”功能,这意味着如果用户从键盘输入一些字母,items控件将被刷新。我的搜索方法是代码隐藏的,只需不到一秒钟。但是,我输入字母和查看结果之间的时间是3-4秒。我有一个窗口关闭命令,我想把它放在显示搜索结果之前的确切时刻。如果我将此命令放在搜索方法的末尾(在代码隐藏中),则在关闭窗口和显示项目之间仍有几秒钟的延迟。我认为绑定很慢,这就是为什么我需要捕获绑定完成时调用的事件。WPF中是否有此类事件

在搜索方法完成之前调用OnPropertyChanged事件,因此这对我没有帮助


我还尝试了OnDataContextChanged事件,但它只被调用一次——当控件初始化时。我需要在用户输入字母并发生新绑定时调用它。

在WPF中的源属性和目标依赖属性之间建立数据绑定时,这个
绑定
实际上被转换成一个
BindingExpression
对象,该对象在适当的时刻执行更新源和目标的繁重任务

不幸的是,
BindingExpression
在更新某些内容时不提供事件,如您在此处所见:


唯一的方法是在定义绑定时,将
UpdateSourceTrigger
设置为
Explicit
,在代码隐藏中获取绑定表达式并手动更新源和目标,这样您就可以完全控制并封装此场景中的常用功能

您可以使用
BindingOperations.GetBindingExpression
静态方法获取
BindingExpression

如果您还有任何问题,请随时提问


旁白:难道没有别的办法吗?如果您正在使用绑定到
ItemsControl
的源集合,是否可以对源集合执行搜索/筛选操作,然后让集合绑定更新您的
ItemsControl

是否启用了虚拟化?如何使用筛选列表刷新控件?@Pragmateek I使用OnPropertyChanged事件刷新它。“手动更新源和目标”如何从代码隐藏中手动更新它?它实际上是一个单向绑定。如果您查看一下
BindingExpression
类(请参见答案中的链接),您会发现两种方法:
UpdateSource
UpdateTarget
。您只需要在适当的时间调用这些函数,这是特定于您的开发环境的,但是我看不出这与我已经做的有什么区别。即使在我调用UpdateSource属性之后,仍然会有几秒钟的延迟,我无法捕捉到绑定完成之前的确切时刻。为什么不呢?当
UpdateSource
方法返回时,绑定完成。您甚至可以在此调用周围放置一个秒表。BindingExpression be=SearchItemsControl.GetBindingExpression(ItemsControl.ItemsSourceProperty);返回null。我做错了什么?SearchItemsControl是ItemsControl的名称,ItemsSource是我设置绑定的属性。