博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF异步MVVM等待窗体
阅读量:7221 次
发布时间:2019-06-29

本文共 3392 字,大约阅读时间需要 11 分钟。

需求描述

  • 在 ViewModel 中处理 Model 中的数据需要一定时间的等待;
  • ViewModel 或 Model 在获取数据或访问同步服务时有一定延迟需要等待;
  • ViewModel 操作 View 加载数据需要一段时间;

解决办法

  • 显示一个等待 UI,当数据处理完毕或服务接口返回后等待UI消失

转动齿轮控件

  • 参考开源实现 SprocketControl :

等待控件

1   
2
16

等待效果

定义 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 状态转变为控件状态

1   public class StatusToAnimationVisibilityConverter : IValueConverter 2   { 3     #region IValueConverter Members 4  5     public object Convert( 6       object value, Type targetType, object parameter, CultureInfo culture) 7     { 8       try 9       {10         string status = value.ToString();11 12         switch (status)13         {14           case "Initializing":15           case "Loading":16           case "Saving":17             return Visibility.Visible;18           case "Loaded":19           case "Saved":20           default:21             return Visibility.Collapsed;22         }23       }24       catch (Exception)25       {26         return Visibility.Collapsed;27       }28     }29 30     public object ConvertBack(31       object value, Type targetType, object parameter, CultureInfo culture)32     {33       return DependencyProperty.UnsetValue;34     }35 36     #endregion37   }

使 UserControl 支持异步显示

1   
2 3

应用 Style 至 UserControl

1 
10

定义基础 ViewModel

1   ///  2   /// 响应式的ViewModel模型 3   ///  4   public abstract class ViewModelResponsive : ViewModelBase, IViewModelResponsive 5   { 6     #region Fields 7  8     private ViewModelStatus _status = ViewModelStatus.None; 9 10     #endregion11     12     #region ViewModel Status13 14     /// 15     /// 刷新UI数据16     /// 17     public virtual void Refresh()18     {19 20     }21 22     /// 23     /// ViewModel状态24     /// 25     public ViewModelStatus Status26     {27       get28       {29         return _status;30       }31       protected set32       {33         if (_status != value)34         {35           _status = value;36           RaisePropertyChanged(@"Status");37         }38       }39     }40 41     #endregion42   }

ViewModel 应用

1   public class CameraManagementViewModel : ViewModelResponsive 2   { 3     protected override void BindCommands() 4     { 5       RefreshCommand = new RelayCommand(() => 6       { 7         Refresh(); 8       }); 9     }10     11     public override void Refresh()12     {13       base.Refresh();14 15       Status = ViewModelStatus.Initializing;16       CameraCollection.Clear();17       Model.GetCameras(GetCamerasCallback);18     }19     20     private void GetCamerasCallback(object sender, AsyncWorkerCallbackEventArgs
> args)21 {22 CameraCollection.Clear();23 Status = ViewModelStatus.Loaded;24 25 if (result)26 {27 foreach (var item in (args.Data as IList
))28 {29 CameraCollection.Add(item);30 }31 }32 }33 }

实现效果

本文转自匠心十年博客园博客,原文链接:XXXXXXXX,如需转载请自行联系原作者
你可能感兴趣的文章
Aop实现SqlSugar自动事务
查看>>
自适应网页设计(Responsive Web Design)
查看>>
纯CSS气泡框实现方法探究
查看>>
9.8---硬币问题(CC150)
查看>>
Handsontable 学习笔记-Methods
查看>>
Python打开新世界的大门-入门篇1
查看>>
使用BatteryHistorian分析和优化应用电量
查看>>
ORM 关系对象映射
查看>>
数组指针与二维数组
查看>>
12款用于渗透测试的操作系统
查看>>
http_load使用详解
查看>>
background复合属性详解(上):background-image
查看>>
去除安装程序的窗口显示(类似于后台安装)
查看>>
Excel和CSV格式文件的不同之处
查看>>
高亮显示,其实就是加入样式
查看>>
第十周web作业2:Object的起源
查看>>
ThunderBird, NewsBlog部分代码阅读笔记
查看>>
BZOJ1034[ZJOI2008]泡泡堂
查看>>
netty对http协议解析原理解析(转载)
查看>>
IaaS, PaaS和SaaS
查看>>