我有一长串要过滤的项目。我在列表中的 View 模型中添加了一个 IsFiltered 属性。使用 ItemContainerStyle 我可以将 ListViewItem 的可见性绑定(bind)到 IsFiltered 属性。
<ListView ItemsSource="{Binding Path=MyItems}">
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsFiltered}" Value="True">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ListView.ItemContainerStyle>
</ListView>
一切正常,更改 IsFiltered 属性正确反射(reflect)在 UI 上。我正在运行一个后台进程来确定要过滤哪些项目,以及当它完成时,每个 View 模型项目的 IsFiltered 属性都会在 UI 线程上更新。问题在于,由于触发了大量的 PropertyChanged 事件,因此出现了非常明显的暂停。我已经设法通过使用来缓解这种情况
public bool IsFiltered
{
get
{
return m_IsFiltered;
}
set
{
if (m_IsFiltered == value)
{
return;
}
m_IsFiltered = value;
Dispatcher.CurrentDispatcher.BeginInvoke(
DispatcherPriority.Background,
(System.Action)(() => RaisePropertyChanged("IsFiltered")));
}
}
在 View 模型中。 RaisePropertyChanged 只是引发 PropertyChanged 事件。
我试图从 View 模型中限制对 UI 框架 (WPF) 的了解。在这种情况下,我只想调用 RaisePropertyChanged 并以某种方式让 UI 负责以异步方式监听属性更改。这可能吗?在触发属性更改时处理事件并不是很重要。
我尝试将 IsAsync=True 添加到 DataTrigger 的绑定(bind)中,但这并没有达到预期的效果。
最佳答案
IsAsync
很好,但是您应该正确确定您的哪一项属性更改(由分配新数据引起)需要长时间运行的任务,然后将其放在那里。 CMIIW IsAsync
您的数据触发器绑定(bind)不起作用,因为要对 IsFiltered
执行更改只是一个简单的任务,不需要长时间运行的任务。
因此,找出其中一项属性更改可能需要长时间运行的任务将 IsAsync = True
那里。
希望有所帮助。
关于c# - 是否可以告诉 WPF 绑定(bind)异步响应 PropertyChanged 事件(低优先级)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3599301/