none
Microsoft.TeamFoundation.MVVMを利用してViewModelからMessageBoxを表示させる方法 RRS feed

  • 質問

  • Microsoft.TeamFoundation.MVVMを利用して、

    ViewModelからメッセージボックスを利用したいと思います。

    Microsoft.TeamFoundation.MVVMの仕様を見ると、

    http://msdn.microsoft.com/ja-jp/library/microsoft.teamfoundation.mvvm(v=vs.110).aspx

    MessageBoxService、MessageBoxArgsといったクラスがあり、

    これを利用すれば、実現できそうな気がするのですが、

    具体的な利用方法がよくわかっておりません。

    ViewModelにて、MeesageBox.show(”TEST”);として、実行させてみたところ、

    添付画像のエラーが出て、XAMLに{Binding}の定義が必要と表示されます。

    MVVMのフレームワークを利用した実装方法のサンプルはたくさん紹介されているのですが、

    できればMicrosoft公式のMicrosoft.TeamFoundation.MVVMを利用したいと思っております。

    対応方法をご存じの方がいれば、教えていただけないでしょうか。

    よろしくお願いいたします。



    • 編集済み sasagaki 2013年11月9日 1:49
    2013年11月9日 1:48

回答

  • なんとなくできた。

    <Window x:Class="WpfApplication1.MainWindow" 
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:mvvm="clr-namespace:Microsoft.TeamFoundation.MVVM;assembly=Microsoft.TeamFoundation.Controls"
            mvvm:MVVMSupport.ViewModel="{Binding}"
            Title="メッセージボックスのタイトルにもなるよ" Height="350" Width="525">
        <Grid>
            <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}}"/>
            </Grid>
        </Grid>
    </Window>
    using System;
    using System.Windows;
    using System.Windows.Input;
    using Microsoft.TeamFoundation.MVVM;
    namespace WpfApplication1
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                this.DataContext = new VM();
            }
        }
    
        class VM : Microsoft.TeamFoundation.MVVM.ViewModelBase
        {
            public VM()
            {
                Name = "変更前";
            }
    
            public String Name { get; set; }
    
            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");
    
                            //ViewModelが適用されたViewによって提供されるMessageBox表示サービスを取得する
                            var mbs = base.ResolveService<Microsoft.TeamFoundation.MVVM.IMessageBoxService>();
                            mbs.Show(Name);
                        });
                    }
                    return _Rename;
                }
            }
        }
    }
    Viewがメッセージの表示方法を決められるようにするために、Viewがサービスという形で表示方法をViewModelに提供するらしい。

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク sasagaki 2013年11月9日 23:47
    2013年11月9日 15:56

すべての返信

  • サービスが無いということなのでMessageBoxService.Createメソッドあたりで事前に作っておいてやるとか?

    そもそもsasagakiさんはどういったアプリケーションを作成したいのでしょうか。TeamFoundationという名前空間から、これらのクラスはTeamFoundationServiceやTeamFoundationServerのクライアント機能拡張に利用するものな気がします。普通の(?)アプリを作成する場合にはあまり利用しないほうがいい気がします。

    そもそも、これらのDLLって再配布してよいのでしょうか?クライアント側にTeam Explorerなどがインストールされていることが動作条件とかですか?

    2013年11月9日 3:48
  • ご返信ありがとうございます。

    作成したいのは、普通のWPFのアプリケーションです。

    今回、MVVMという考え方があるのを知って、

    できればMS標準のDLLを参照して実装しようと思いました。

    WPFでMVVMでアプリケーションを作成したい場合、

    Microsoft.TeamFoundation.MVVMを利用するのではなく、

    専用のライブラリ(MVVM Light Toolkit等)を利用して作成するものなのでしょうか?

    確かに、情報が少なすぎる気はしていたのですが・・・


    • 編集済み sasagaki 2013年11月9日 4:15
    2013年11月9日 4:07
  • なんとなくできた。

    <Window x:Class="WpfApplication1.MainWindow" 
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:mvvm="clr-namespace:Microsoft.TeamFoundation.MVVM;assembly=Microsoft.TeamFoundation.Controls"
            mvvm:MVVMSupport.ViewModel="{Binding}"
            Title="メッセージボックスのタイトルにもなるよ" Height="350" Width="525">
        <Grid>
            <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}}"/>
            </Grid>
        </Grid>
    </Window>
    using System;
    using System.Windows;
    using System.Windows.Input;
    using Microsoft.TeamFoundation.MVVM;
    namespace WpfApplication1
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                this.DataContext = new VM();
            }
        }
    
        class VM : Microsoft.TeamFoundation.MVVM.ViewModelBase
        {
            public VM()
            {
                Name = "変更前";
            }
    
            public String Name { get; set; }
    
            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");
    
                            //ViewModelが適用されたViewによって提供されるMessageBox表示サービスを取得する
                            var mbs = base.ResolveService<Microsoft.TeamFoundation.MVVM.IMessageBoxService>();
                            mbs.Show(Name);
                        });
                    }
                    return _Rename;
                }
            }
        }
    }
    Viewがメッセージの表示方法を決められるようにするために、Viewがサービスという形で表示方法をViewModelに提供するらしい。

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク sasagaki 2013年11月9日 23:47
    2013年11月9日 15:56
  • gekka様

     ご回答ありがとうございました。

     海外のサイトでもサンプルがなかったので、MSのクラスの仕様を見て作るしかなかったのですが、

     私の力ではどうしようもありませんでした。

     この先は、サービスを自作して、Viewmodelで呼び出す方法を調査していきたいと思います。

     本当にありがとうございました。

     

    2013年11月9日 23:47