0

私は自分の絵を保存する必要がある絵のアプリケーションを開発しています。保存するには、ファイルの保存ダイアログを表示する必要があります。MVVMパターンを実装しているため、イベントハンドラーを直接使用することはできません。しかし、実装中に、PropertyChangedイベントを直接使用することを考えました。

ViewModelにINotifyPropertyChangedを実装し、すべてのコマンドをバインドしました。ViewModelの保存コマンドで私は呼び出しました

    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;
         }

これは私の状況ではうまく機能しますが、この実装のダークサイドはわかりません。

正しいですか????

4

3 に答える 3

3

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

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

于 2011-08-09T14:18:06.593 に答える
1

カスタムイベントを作成してみませんか?ViewModelでこのようなもの:

public event EventHandler<EventArgs> ShowSaveDialog;

その後、

ViewModel.ShowSaveDialog += OnShowSaveDialog;

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

私はPropertyChangedをそのように「乱用」するだけではありません。おそらくあなたの実装には何の問題もありません、それはただ正しく感じられません。また、マジックストリングを使用していますが、カスタムイベントがある場合は、はるかに宣言型であり、コードの他のユーザーは、このイベントをサブスクライブする方法があることをすぐに理解します。
追加情報を渡す必要がある場合は、必要なEventArgsプロパティを実装して追加します。

于 2011-08-09T14:00:16.987 に答える
1

ウィルが言ったように、正しいことも悪いこともありません...最良の選択だけです!

個人的には、私は純粋主義者の側に傾倒し、関心の分離を明確にするためにシステムを設計しようとします...しかし、それは私だけです!

これがあなたと同じ問題を扱っている投稿に私が与えた答えです。そこで、ビューモデルからビューコードをクリーンに保ちたい場合に、現在2つのアプローチが浮かんでいることを示します。

しかし、繰り返しになりますが、ニーズ/好みに最適な方法を選択してください。

于 2011-08-09T14:25:25.697 に答える