当前位置: 编程技术>.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.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。