0

WPF MVVMのビューのコードビハインドファイルに関して、どの規則に従う必要があるかがわかりません。

私の特定のシナリオでは、ビューのボタンのクリックイベントにリンクされたコードビハインドにコードを配置して、ハードドライブから画像を見つけ、これを画像コントロールにロードすることが良い習慣であるかどうかを知りたいです。ビューで。コードは次のようになります。

var ofd = new OpenFileDialog { Filter = "Bitmap Files(*.bmp)|*.bmp" };

ofd.ShowDialog();

if (ofd.FileName != null)
{
    var image = BitmapFactory.ConvertToPbgra32Format(new WriteableBitmap(new BitmapImage(new Uri(ofd.FileName, UriKind.Absolute))));

    MyImageControl.Width = image.Width;
    MyImageControl.Height = image.Height;

    MyImageControl.Source = image;
}

これは、コードビハインドビューのロジックが多すぎますか?もしそうなら、これをViewModelに配置するか、別のクラスに配置して、Viewからメソッドを呼び出す必要がありますか?

また、より広いスケールで、誰かがビューのコードビハインドに入れることが一般的に許容できると考えられるものとそうでないものに関するいくつかの決定的なガイドラインへのリンクを提供できれば素晴らしいでしょう。

ありがとう

4

2 に答える 2

2

まず第一に、MVVMは、あなたが言ったように、ルールではなく一連のガイドラインであることを覚えておくことが重要です。そして時々それはどこにあるべきか少し大ざっぱになることがあります...

とは言うものの、あなたの例では、 UI固有のロジックではないロジックがかなりたくさんあります。

ハードドライブからの画像のロードは、ViewModelで確実に実行する必要があります。次に、画像をViewModelのプロパティに設定する必要があります。次に、ビューのImageコントロールは、を上記のプロパティにバインドする必要がありImageSourceます。

ダイアログについて(例:OpenFileDialog)-これを行うには3つの有効な(IMHO)方法があります。

1つは、ViewModelによって呼び出される「FileChoosingService」を作成することです。次に、OpenFileDialogを起動して、ファイル名を返します。

2番目のオプションは、ビューからダイアログを開き、結果をViewModelのプロパティに設定することです。ビューモデルは、プロパティが変更されたことを確認し、ハードドライブから画像をロードします。

3番目のオプションは2番目のオプションと同じですが、プロパティを設定する代わりに、ビューLoadImageCommandでViewModelでaを呼び出しCommandParameter、ファイル名として渡します。

于 2013-02-06T15:54:27.460 に答える
1

一般的なベストプラクティスは、可能な限り背後にあるコードを回避することです。この場合、それを回避できるように思えます。これは、ビューの問題だけではありません。つまり、同じビューモデルのさまざまなビューに適用できるロジックです。

また、コードはコードビハインドに含まれているため、テストが困難です。ユーザーが無効な画像ファイルを選択した場合、エラーがログに記録されるなどをテストすることをお勧めします。これは、ロジックがビューモデルにある場合はかなり簡単です。

とにかくこれがビューモデルに入れられないという技術的な理由もないようです。

他の質問に答えるには、現在の画像であるビューモデルにパブリックプロパティを設定し、ビューでデータバインディングを使用して、その画像プロパティをImageコントロールのソースにバインドする必要があります。

また、MVVMフレームワークの使用を真剣に検討する必要があります。それらは、すでに実装されているベースビューモデルタイプを提供しますINotifyPropertyChanged

于 2013-02-06T15:57:48.320 に答える