WindowsPhone开发笔记(1)—— ViewMoel
废话: 前很长一段时间一直忙于写 GuoKr Reader 和 喂饭 。 现在终于可以 整理一下开发中的有点价值的东西。
额。。。ViewModel 这东西 直面意思就是界面对象。。他里面描述的东西应该只有 数据和业务逻辑 ,他里面不应该与任何与 界面交互相关的东西 (比如控制一个什么控件 ,动画、消息框什么的。。。。。 )易做图(别想歪了 我故意的。。。)
但是我们在实际使用中VM 中的发生了一些事情 总得让VIEW 知道啊 所以MS 为我们提供了
System.ComponentModel.INotifyDataErrorInfo
System.ComponentModel.INotifyPropertyChanged
System.ComponentModel.InotifyPropertyChanging
等 通知 接口
我们以INotifyPropertyChanged 为例来看下结构:
里面有个 事件:PropertyChanged
VM 通过这些通知接口里面的事件 我们可以告知 View 发生了什么事情 至于 View 管不关心 或者关心什么那就不是 ViewModel的事情了
(注意: 一般来说 要绑定要界面的属性必须实现INotifyPropertyChanged 属性 也就是说在属性被修改后必须触发 PropertyChanged事件,同时Notify 接口中的事件是在UI 现场中运行的 在跨线程运行的时候一定要注意)
我们在回过头来说VM
一般来说或我都会实现一个 BaseViewModel 吧所需要的实现的接口和基础的方法都在里面实现好
using System;
using System.Net;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Threading;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using System.Runtime.CompilerServices;
using WeiFan.Utility;
namespace WeiFan.UI.ViewModel
{
public abstract class BaseViewModel : INotifyPropertyChanged, INotifyPropertyChanging,INotifyDataErrorInfo
{
Dispatcher _dispatcher;
public BaseViewModel()
{
_dispatcher = Deployment.Current.Dispatcher;
}
protected Dispatcher Dispatcher { get { return _dispatcher; } }
protected PhoneApplicationFrame PhoneApplicationFrame { get { return (Application.Current.RootVisual as Microsoft.Phone.Controls.PhoneApplicationFrame); } }
private Dictionary<String, List<String>> m_errors =
new Dictionary<string, List<string>>();
public event PropertyChangedEventHandler PropertyChanged;
public event PropertyChangingEventHandler PropertyChanging;
public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
public System.Collections.IEnumerable GetErrors(string propertyName)
{
if (String.IsNullOrEmpty(propertyName) ||
!m_errors.ContainsKey(propertyName)) return null;
return m_errors[propertyName];
}
public bool HasErrors
{
get { return m_errors.Count > 0; }
}
protected bool SetProperty<T>(ref T storage, T value,string propertyName)
{
if (object.Equals(storage, value)) return false;
this.FirePropertyChanging(new PropertyChangingEventArgs(propertyName));
storage = value;
this.FirePropertyChanged(new PropertyChangedEventArgs(propertyName));
return true;
}
protected virtual void FirePropertyChanging(PropertyChangingEventArgs args)
{
if (PropertyChanging != null)
{
PropertyChanging(this, args);
}
}
protected virtual void FirePropertyChanged(PropertyChangedEventArgs args)
{
if (PropertyChanged != null)
{
PropertyChanged(this, args);
}
}
protected virtual void FireErrorsChanged(DataErrorsChangedEventArgs args)
{
if (ErrorsChanged != null)
ErrorsChanged(this, args);
}
protected virtual void AddError(string propertyName, string error, bool isWarning)
{
if (!m_errors.ContainsKey(propertyName))
m_errors[propertyName] = new List<string>();
if (!m_errors[propertyName].Contains(error))
{
if (isWarning) m_errors[propertyName].Add(error);
else m_errors[propertyName].Insert(0, error);
&n
补充:移动开发 , Windows Phone ,