コードスニペットを使った INotifyPropertyChanged の実装(再度更新)
前回からの更新:
- プロパティ名、internal static readonly の方がよかった
- 補助関数とか、dll 化
- ついでに MVVM でよく使う DelegateCommand とか、依存プロパティ用のコードスニペットも追加
- 正直、結構な割合車輪の再発明
以下、サンプル:
class Sample : DependencyObject, INotifyPropertyChanged
{
public int X
{
get { return (int)GetValue(XProperty); }
set { SetValue(XProperty, value); }
}public static readonly DependencyProperty XProperty =
DependencyPropertyHelper<Sample>.Register(_ => _.X);#region Y
public double Y
{
get { return _Y; }
set
{
_Y = value;
PropertyChanged.Raise(this, YName);
}
}private double _Y;
internal static readonly string YName = PropertyName<Sample>.Get(_ => _.Y);#endregion
#region SampleCommandprivate void SampleCommandHandler(object parameter)
{
throw new NotImplementedException();
}public ICommand SampleCommand
{
get
{
if (_SampleCommand == null)
_SampleCommand = new DelegateCommand { CommandHandler = this.SampleCommandHandler };
return _SampleCommand;
}
}
private ICommand _SampleCommand;#endregion
public event PropertyChangedEventHandler PropertyChanged;
}
すみません、質問があるのですがよろしければ教えていただけないでしょうか。
この記事のソースコードに含まれていたViewModelCommandの用途がわかりませんでした。
「ViewModel内でよく使う」とコードに書かれていて、さらにプロパティとしてVMを持っています。
ですが、MVVM開発をしていてそういった場面に遭遇していませんでした。
私の開発パターンが間違っているのか、これを知るととても便利なことになるのか、ヒントを頂けると助かります。
宜しくお願い致します。
しみみん (@KatsuYuzu)
2011年12月23日 at 10:34
ああ、DelegateCommandがあれば不要なものですね。
デリゲートを外から射すんじゃなくて、Executeをオーバーライドして実装したいときに使います。
ufcpp
2011年12月23日 at 11:14
ありがとうございます。
VMを引き渡してExecuteの中でVMのMethodを呼ぶような感じでしょうか。
> ああ、DelegateCommandがあれば不要なものですね。
たしかに、上記の様な感じであればActionを引き渡すDelegateCommandの方が汎用的で便利ですね。
お答えいただきありがとうございました。
しみみん (@KatsuYuzu)
2011年12月23日 at 12:29
[…] ある人はT4テンプレートで自動生成し、ある人はヘルパークラスを作成し、またある人はVS拡張のデザイナーを作ったりしています。 […]
INotifyPropertyChangedを注入する「Notify Property Weaver」 « be free
2012年2月20日 at 23:57