当前位置:  编程技术>.net/c#/asp.net

关于WPF异步MVVM等待窗体的介绍

    来源: 互联网  发布时间:2014-10-18

    本文导语:  需求描述•在ViewModel中处理Model中的数据需要一定时间的等待•ViewModel或Model在获取数据或访问同步服务时有一定延迟需要等待•ViewModel操作View加载数据需要一段时间解决办法•显示一个等待UI,当数据处理完毕或服务接口返回...

需求描述
•在ViewModel中处理Model中的数据需要一定时间的等待
•ViewModel或Model在获取数据或访问同步服务时有一定延迟需要等待
•ViewModel操作View加载数据需要一段时间
解决办法
•显示一个等待UI,当数据处理完毕或服务接口返回后等待UI消失
转动齿轮控件
•参考开源实现SprocketControl :http://wpfspark.codeplex.com/
等待控件

代码如下:


    
  

等待效果

定义MVVM中的ViewModel的状态

代码如下:

///
  /// 在MVVM模式中ViewModel的状态
  ///
  [Flags]
  public enum ViewModelStatus
  {
    ///
    /// ViewModel无状态
    ///
    None = 0x0,
    ///
    /// ViewModel正在初始化
    ///
    Initializing = 0x1,
    ///
    /// ViewModel初始化完毕
    ///
    Initialized = 0x2,
    ///
    /// ViewModel正在加载
    ///
    Loading = 0x4,
    ///
    /// ViewModel加载完毕
    ///
    Loaded = 0x8,
    ///
    /// ViewModel正在保存
    ///
    Saving = 0x16,
    ///
    /// ViewModel保存完毕
    ///
    Saved = 0x32
  }

ViewModel状态转变为控件状态
代码如下:

public class StatusToAnimationVisibilityConverter : IValueConverter
   {
     #region IValueConverter Members

     public object Convert(
       object value, Type targetType, object parameter, CultureInfo culture)
     {
       try
       {
         string status = value.ToString();

         switch (status)
         {
           case "Initializing":
           case "Loading":
           case "Saving":
             return Visibility.Visible;
           case "Loaded":
           case "Saved":
           default:
             return Visibility.Collapsed;
         }
       }
       catch (Exception)
       {
         return Visibility.Collapsed;
       }
     }

     public object ConvertBack(
       object value, Type targetType, object parameter, CultureInfo culture)
     {
       return DependencyProperty.UnsetValue;
     }

     #endregion
   }

使UserControl支持异步显示
代码如下:



  
    
      
        
          
            
            
              
              
            
          
        
      
    
  

应用Style至UserControl
代码如下:


 

定义基础ViewModel
代码如下:

///
   /// 响应式的ViewModel模型
   ///
   public abstract class ViewModelResponsive : ViewModelBase, IViewModelResponsive
   {
     #region Fields

     private ViewModelStatus _status = ViewModelStatus.None;

     #endregion

     #region ViewModel Status

     ///
     /// 刷新UI数据
     ///
     public virtual void Refresh()
     {

     }

     ///
     /// ViewModel状态
     ///
     public ViewModelStatus Status
     {
       get
       {
         return _status;
       }
       protected set
       {
         if (_status != value)
         {
           _status = value;
           RaisePropertyChanged(@"Status");
         }
       }
     }

     #endregion
   }

ViewModel应用
代码如下:

public class CameraManagementViewModel : ViewModelResponsive
   {
     protected override void BindCommands()
     {
       RefreshCommand = new RelayCommand(() =>
       {
         Refresh();
       });
     }

     public override void Refresh()
     {
       base.Refresh();

       Status = ViewModelStatus.Initializing;
       CameraCollection.Clear();
       Model.GetCameras(GetCamerasCallback);
     }

     private void GetCamerasCallback(object sender, AsyncWorkerCallbackEventArgs args)
     {
       CameraCollection.Clear();
       Status = ViewModelStatus.Loaded;

       if (result)
       {
         foreach (var item in (args.Data as IList))
         {
           CameraCollection.Add(item);
         }
       }
     }
   }


    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • WPF 实现倒计时的代码
  • wpf将表中数据显示到datagrid示例
  • 深入分析WPF客户端读取高清图片卡以及缩略图的解决方法详解
  • WPF绑定实例详解
  • 在Winform和WPF中注册全局快捷键实现思路及代码
  • 在WinForm和WPF中使用GMap.Net地图插件简单教程


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3