none
ViewModelから、View(XAML)にある複数のボタンのうち、どのボタンをクリックしたか知る方法 RRS feed

  • 質問

  • 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
    2013年11月8日 10:47

回答

  • 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!)


    • 回答としてマーク sasagaki 2013年11月8日 23:59
    • 編集済み gekkaMVP 2013年11月9日 15:44 コードの間違い修正
    2013年11月8日 12:16

すべての返信

  • 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!)


    • 回答としてマーク sasagaki 2013年11月8日 23:59
    • 編集済み gekkaMVP 2013年11月9日 15:44 コードの間違い修正
    2013年11月8日 12:16
  • ご返信ありがとうございます。

    まさに、この書き方が知りたかったです。

    お忙しいところ、ありがとうございました。

    2013年11月8日 23:59