代码之家  ›  专栏  ›  技术社区  ›  ChrisHDog

在wpflistview进行数据绑定时,如何显示进度微调器(或其他UI)?

  •  3
  • ChrisHDog  · 技术社区  · 16 年前

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

    是否有处理长数据绑定的推荐机制,或者是否存在我要查找的事件,但我查找的位置不对?任何帮助都将不胜感激。

    编辑:

    **解决方案:**我创建了一个新的表示对象,并设置Cursor=Wait,然后遍历之前绑定到ListView的对象,并从中创建表示对象(这导致执行计算属性),然后一旦创建了表示对象列表,就将这些对象绑定到ListView和stet光标=箭头。令人失望的是,似乎没有数据绑定完成类型的事件(或者在数据绑定完成后触发的任何事件,可以更新UI),但是这个解决方案似乎可以工作。

    3 回复  |  直到 16 年前
        1
  •  5
  •   Chris Holmes    16 年前

    我也有类似的情况。我正在使用MVVM,我的工作如下:

    public bool IsBusy
    {
       get { return _isBusy; }
       set
       {
          _isBusy = value;
          NotifyPropertyChanged("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}}" >
    

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

    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;
        }
    
      }
    }
    

    异步获取数据完成后,我将其封送回UI线程,然后将IsBusy属性设置为false。然后光标恢复正常。

    至于异步调用和封送回UI,我留给您查看,因为这是这个答案的另一部分。我使用一个动作委托,并使用BeginInvoke将其称为async,然后使用我在这里找到的技术封送回UI线程: http://www.wintellect.com/CS/blogs/jlikness/archive/2009/12/16/dispatching-in-silverlight.aspx

    我希望这有帮助!

        2
  •  2
  •   Community Mohan Dere    9 年前

    current thread 在这里我解释一个基本的 BackgroundWorker

    实际上,您将拥有一个显示“Please Wait”控件的函数,然后使用BackgroundWorker在另一个线程上执行长时间运行的计算。当计算完成时,会触发另一个事件,表示BackgroundWorker已完成,然后可以隐藏“Please Wait”控件并绑定数据。如果可能的话,也可以报告计算的进度。

        3
  •  0
  •   ChrisHDog    16 年前

    最后,我创建了一个新的表示对象,并设置Cursor=Wait,然后遍历之前绑定到ListView的对象,并从中创建表示对象(这导致执行计算属性),然后创建表示对象列表后,将这些对象绑定到ListView和stet Cursor=Arrow。

    令人失望的是,似乎没有数据绑定完成类型的事件(或者在数据绑定完成后触发的任何事件,可以更新UI),但是这个解决方案似乎可以工作。