c# - 是否可以告诉 WPF 绑定(bind)异步响应 PropertyChanged 事件(低优先级)?

标签 c# wpf xaml mvvm

我有一长串要过滤的项目。我在列表中的 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/

相关文章:

c# - Mono 编译错误 - 无法从程序集 'System.Runtime.CompilerServices.ReferenceAssemblyAttribute' 加载类型 'System'

javascript - 如何使用jQuery来显示HtmlTableRow(开始隐藏/隐藏生命)?

c# - 为什么在编译时有 dll 文件被复制到我的项目的 Bin/Debug 文件夹中,尽管没有引用任何这些库?

wpf - 如何将 Shell 中的按钮绑定(bind)到已加载模块的 View 模型中定义的命令?

wpf - 带有 Prism 的 Wpf 中模块之间的 ApplicationCommands 问题

c# - 单击IconButton后如何打开ContextMenu?

c# - 如何在 C# 中初始化默认值?

c# - WPF DataGrid - 在行选择/失去焦点时防止颜色变化

wpf - 当 Popup 的 IsOpen 属性设置为 True 时开始 StoryBoard

c# - 如何为 TextBlock 中的文本创建边框?