2011-08-09 12 views
0

私は自分の絵を保存する必要がある絵画アプリケーションを開発しています。 私はMVVMのパターンを実装しているので、私は直接イベントハンドラを使用することはできません。 しかし、実装私はPropertyChangedイベントdirectolyを使用すると思った。OnPropertyChangeを使用してMVVMでファイルを保存ダイアログを開くと、OKまたはなし

私はViewModelでINotifyPropertyChangedを実装しましたが、私はすべてのコマンドをbindしています。 では、私は

OnPropertyChanged("Show Save Dialog"); // in ViewModel 

と呼ばれているし、ユーザーコントロールの背後にあるコードでは、私は

ViewModel.PropertyChanged += new // in code behind of user control 
      System.ComponentModel.PropertyChangedEventHandler(ViewModel_PropertyChanged); 

としてイベントハンドラを追加したとViewModel_PropertyChangedに私は

switch (e.PropertyName) // in code behind of user control 
     { 
      case "Show Save Dialog": ShowSaveFileDialog();// this function shows dialog. 
      break; 
     } 

この作品を持っているのViewModelにコマンドを保存私の状況では問題ありませんが、この実装の暗い側面はわかりません。

それは正しいですか?????

答えて

3

右か?是非とも、現時点で最良の選択肢だけが正しいか悪いのかはわかりません。純粋主義者のための唯一の方法は、そのような入力をインターフェイスの背後でユーザーから取得するプロセスを抽象化し、次にこのインターフェイスを提供し、何らかの形でそれを注入するViewクラスを作成することです(IoC/DI、 ViewModelはそのようにインスタンス化されます)。

個人的には、がこのを気にする必要がなければ、個人的には、これについて心配するのはあまり時間を費やすことはありません。私は両方の方法でそれをやった。あなたの平均的なMVVMアプリケーションでは、MessageBox、OpenFileDialogなどを使うだけの犯罪ではないと思います。非常にテストされたアプリケーションの場合は、抽象化する必要があります。それを必要とする他の状況もあります。たとえば、アプリケーションとVisual Studioエクステンションに存在するコードがあります。 VSには、MessageBoxの代わりに使用される独自のダイアログタイプがあります。抽象化が適切です。しかし、私は理由がない限り、仕事に投資しません。

1

カスタムイベントを作成してみませんか?あなたのViewModelでこのような何か:その後、

public event EventHandler<EventArgs> ShowSaveDialog; 

と私はちょうどそのようにPropertyChanged "虐待" ではないでしょう

ViewModel.ShowSaveDialog += OnShowSaveDialog; 

private void OnShowSaveDialog(object sender, EventArgs e){ 
    //handle the event 
} 

を使用しています。おそらくあなたの実装に間違いはないでしょう。ただ気分が悪いだけです。また、魔法の文字列を使用していますが、カスタムイベントがあると宣言的になり、コードの他のユーザーはすぐにこのイベントを購読する方法がわかります。
追加情報を渡す必要がある場合は、EventArgsの実装を行い、必要なプロパティを追加します。

1

よく、Willには正しいか間違っていると言われました。

個人的には、私は純粋主義者の方が多い傾向にあり、懸念を明確に分離するシステムを構築しようとしています...しかし、それは私だけです!

Here is an answer私はあなたと同じ問題を扱っている投稿に与えました。ここでは、ビューモデルを任意のビューコードできれいに保ちたいときに浮かび上がる2つの方法を示します。

さらに、あなたのニーズや嗜好に最も適した方法を選択してください。

関連する問題