public class ViewModelBase : INotifyPropertyChanged, IDisposable
{
public event PropertyChangedEventHandler PropertyChanged;
public bool IsInDesignMode;
/// <summary> 显示名称 </summary>
public virtual string DisplayName { get ; protected set ; }
#region 构造
public ViewModelBase()
{
}
#endregion
private void OnPropertyChanged( string propertyName)
{
if ( this .PropertyChanged != null )
{
this .PropertyChanged( this , new PropertyChangedEventArgs(propertyName));
}
}
private static string GetProperyName( string methodName)
{
if (methodName.StartsWith( "get_" ) || methodName.StartsWith( "set_" ) ||
methodName.StartsWith( "put_" ))
{
return methodName.Substring(4);
}
throw new Exception(methodName + " not a method of Property" );
}
protected void SetProperty<T>( ref T name, T value)
{
if ( object .Equals(name, value)) return ;
name = value;
string propertyName = GetProperyName( new System.Diagnostics.StackTrace( true ).GetFrame(1).GetMethod().Name);
this .OnPropertyChanged(propertyName);
}
#region IDisposable Members
public void Dispose()
{
this .OnDispose();
}
/// <summary>
/// 若支持IDisposable,请重写此方法,当被调用Dispose时会执行此方法。
/// </summary>
protected virtual void OnDispose()
{
}
#endregion
}
public class CommandBase : System.Windows.Input.ICommand
{
private Action<Object> _doWork;
private readonly Func< object , bool > _canExecute;
/// <summary>
/// 实例化一个CommandBase对象
/// </summary>
/// <param name="doWork">委托一个有object类型参数的命令执行函数</param>
/// <param name="canExecute">委托一个有object类型参数的命令是否能被执行的函数(可选)</param>
/// <exception cref="ArgumentNullException">参数command不可以为null引用</exception>
public CommandBase(Action< object > doWork, Func< object , bool > canExecute = null )
{
if (doWork == null )
throw new ArgumentNullException( "doWork" );
_canExecute = canExecute;
_doWork = doWork;
}
public bool CanExecute(Object parameter)
{
return true ;
}
public void Execute(Object parameter)
{
if ( this ._doWork != null )
this ._doWork(parameter);
}
public event EventHandler CanExecuteChanged
{
add { }
remove { }
}
}
|