トップ回答者
ViewModelから、View(XAML)にある複数のボタンのうち、どのボタンをクリックしたか知る方法

質問
-
Microsoft.TeamFoundation.MVVM;を利用して、初めてMVVMの開発に挑戦しております。
ViewModelからViewの情報を取得したいのですが、方法がわからないので、
ご存知の方がいれば、教えてください。
(やりたいこと)
1.XAMLに2つのボタンを用意しておいて、そのボタンには同じコマンド(Rename)をバインディングします。
ボタンの名前をButton1、Button2とします。
2.ViewModelのRenameコマンドにて、どちらのボタンからクリックされたか情報を取得したいです。
ボタンのContentプロパティに、Button1、Button2とセットし、
ViewModelでクリックされたボタンのContentプロパティの値を取得したいです。
通常のイベントハンドラを使えば、senderオブジェクトから、クリックしたイベントの情報を取得できると思うのですが・・・
<ViewModel> class VM : ViewModelBase { public VM () { Name = "変更前"; } public String Name { get; set; } ICommand _Rename; public ICommand Rename { get { return _Rename = new RelayCommand(delegate(object parameter) { Name = "変更後"; RaisePropertyChanged("Name"); }); } } }
<XAML> <Grid> <Button Content="Button1" HorizontalAlignment="Left" Margin="272,134,0,0" VerticalAlignment="Top" Width="75" Command="{Binding Rename}"/> <Button Content="Button2" HorizontalAlignment="Left" Margin="272,173,0,0" VerticalAlignment="Top" Width="75" Command="{Binding Rename}"/> </Grid>
- 編集済み sasagaki 2013年11月8日 10:55
回答
-
CommandParemeterに与えたパラメーターがRelayCommandに設定したデリゲートの引数に渡されます。
ContentPropertyの値が欲しい場合は、RelativeSourceでボタン自身をソースにしたバインドでContentを設定します。
<Grid> <Button Content="Button1" HorizontalAlignment="Left" Margin="272,134,0,0" VerticalAlignment="Top" Width="75" Command="{Binding Path=Rename}" CommandParameter="{Binding Content,RelativeSource={RelativeSource Self}}"/> <Button Content="Button2" HorizontalAlignment="Left" Margin="272,173,0,0" VerticalAlignment="Top" Width="75" Command="{Binding Path=Rename}" CommandParameter="{Binding Content,RelativeSource={RelativeSource Self}}"/> </Grid>
ICommand _Rename; public ICommand Rename { get { if (_Rename == null) //比較を間違えていたのを修正 { return _Rename = new RelayCommand(delegate(object parameter) { if (parameter == null) { Name = string.Empty; } else { Name = parameter.ToString(); } RaisePropertyChanged("Name"); }); } return _Rename; } }
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
すべての返信
-
CommandParemeterに与えたパラメーターがRelayCommandに設定したデリゲートの引数に渡されます。
ContentPropertyの値が欲しい場合は、RelativeSourceでボタン自身をソースにしたバインドでContentを設定します。
<Grid> <Button Content="Button1" HorizontalAlignment="Left" Margin="272,134,0,0" VerticalAlignment="Top" Width="75" Command="{Binding Path=Rename}" CommandParameter="{Binding Content,RelativeSource={RelativeSource Self}}"/> <Button Content="Button2" HorizontalAlignment="Left" Margin="272,173,0,0" VerticalAlignment="Top" Width="75" Command="{Binding Path=Rename}" CommandParameter="{Binding Content,RelativeSource={RelativeSource Self}}"/> </Grid>
ICommand _Rename; public ICommand Rename { get { if (_Rename == null) //比較を間違えていたのを修正 { return _Rename = new RelayCommand(delegate(object parameter) { if (parameter == null) { Name = string.Empty; } else { Name = parameter.ToString(); } RaisePropertyChanged("Name"); }); } return _Rename; } }
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)