WPF開発時の痕跡日記帳(二)——MVVMベースクラス
4511 ワード
私たちがMVVMを使うときにINotifyPropertyChangedを実現するには、毎回このインタフェースを実現するのが面倒なので、ベースクラスの役割が現れます.コードは次のとおりです.
使用方法は次のとおりです.例:
例を見て、簡単な感じがしますか?詳細なテストコードは、後続の記事で参考にします.
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 { }
}
}
使用方法は次のとおりです.例:
public class TestViewModel : ViewModelBase
{
public TestViewModel()
{
this.LoadCommand = new CommandBase((Object parameter) => Loading());
}
#region
private string _name;
/// <summary> </summary>
public string IsEnable
{
get { return _name; }
set
{
base.SetProperty<string>(ref this._name, value);
}
}
#endregion
#region
/// <summary>
///
/// </summary>
public ICommand LoadCommand { get; set; }
#endregion
#region
/// <summary>
///
/// </summary>
public void Loading()
{
}
#endregion
}
例を見て、簡単な感じがしますか?詳細なテストコードは、後続の記事で参考にします.