当WPF ListView是DataBound时,如何显示Progress Spinner(或其他UI)?

Chr*_*Dog 3 .net data-binding wpf listview

我有一个绑定到对象列表的WPF列表视图.要显示的项目之一是计算属性(只读,返回字符串),需要花费很少的时间来计算.当窗口最初加载时(或任何时候使用Notify事件更新UI),UI将在发生此数据绑定时挂起.我想知道的是一个很好的机制来处理这个问题(理想情况下,我想做一些事情,就像用旋转器和文本"处理......"或类似的方式使屏幕变灰一样).

我想我可以通过捕获数据绑定事件的开始并触发一个故事(或类似的)并在数据绑定事件的结束被触发时停止故事来做到这一点,但我找不到那种性质的事件.

有没有推荐的机制来处理长数据绑定或做我正在寻找的事件,但我在错误的位置?任何帮助,将不胜感激.

编辑:我可以获取一个旋转图标(Cursor.Wait),同时数据来源和数据绑定(使用下面的解决方案的部分),但现在需要知道数据绑定何时完成.一旦控件放在屏幕上(直接发生),.Loaded事件似乎会触发,但是在更新数据时不会发生.似乎没有针对ListView的OnDataBoundCompleted类型事件,有关在数据绑定过程完成时如何通知的任何想法/想法?

编辑:现在看看TargetUpdated事件,但得到一些奇怪的结果.如果我在TargetUpdated的事件处理程序中放置一个消息框,则更新UI(ListView显示数据),然后显示消息框.如果我剪切了消息框并且只有一个变量设置(即IsBusyCursor = Cursors.Arrow),它会在ListView显示数据之前执行此操作.

**解决方案:**我最终创建了一个新的演示文稿对象并设置Cursor = Wait然后循环遍历我之前绑定到ListView的对象并从中创建演示文稿对象(这导致计算属性被执行)然后创建了演示文稿对象的列表,将它们绑定到ListView和stet Cursor = Arrow.失望的似乎没有DataBinding Completed类型事件(或者在数据绑定完成后触发更新UI的任何事件被触发),但此解决方案似乎有效.

Chr*_*mes 5

我有类似的情况ChrisHDog.我正在使用MVVM,这就是我所做的:

首先,在我的ViewModel中,我建立一个名为IsBusy的Property:

public bool IsBusy
{
   get { return _isBusy; }
   set
   {
      _isBusy = value;
      NotifyPropertyChanged("IsBusy");
   }
}
Run Code Online (Sandbox Code Playgroud)

然后,当涉及加载实际数据时,我会触发异步事件.但就在我这样做之前,我将IsBusy属性设置为true.在我的XAML中,我将光标绑定到此:

<UserControl x:Class="UserControls.Views.AgentListView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:Converters="clr-namespace:UserControls.Utility.Converters" 
             xmlns:Controls="clr-namespace:UserControls.Controls" 
             xmlns:DependencyProperties="clr-namespace:UserControls.DependencyProperties" 
             Cursor="{Binding IsBusy, Converter={Converters:CursorExtensionConverter}}" >
Run Code Online (Sandbox Code Playgroud)

CursorExtensionConverter只是一个简单的IValueConverter,用于将布尔值转换为XAML可以理解的正确Cursor值:

namespace UserControls.Utility.Converters
{
  public class CursorExtensionConverter : MarkupExtension, IValueConverter
  {
    private static CursorExtensionConverter instance = new CursorExtensionConverter();

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
      if (value != null && ((bool) value))
        return Cursors.Wait;
      else
        return Cursors.Arrow;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
      throw new NotImplementedException();
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
      return instance;
    }

  }
}
Run Code Online (Sandbox Code Playgroud)

当数据以异步方式获取时,我将其封送回UI线程,然后将IsBusy属性设置为false.然后光标恢复正常.

至于异步调用和封送回UI,我留给你查找,因为它是这个答案的不同部分.我使用Action委托并使用BeginInvoke将其称为异步,然后使用我在此处找到的技术编组回UI线程:http://www.wintellect.com/CS/blogs/jlikness/archive/2009/12/16 /dispatching-in-silverlight.aspx.

我希望有所帮助!

  • 所以看起来实际花费时间的是绑定本身,数据到网格,而不是提取.为此,我不知道该怎么做; 我还没有在DataGrid上看到任何与之相关的事件.我想知道在更新DataSource之前和之后简单地在ViewModel上设置IsBusy属性(我认为是ObservableCollection)会起作用吗? (2认同)