2011-02-02 9 views
7

私は、コードのこの部分について考えて何を決めるのトラブルを抱えているにWPFの仕様を持つことのデメリット:長所とビューモデル

public SolidColorBrush Brush 
{ 
    get { return IsValid ? _validItemBrush : _invalidItemBrush; } 
} 

それは私の現在のプロジェクトではとのようにビューモデルの一部でありますあなたは想像することができますが、BrushはUIのいくつかのテキスト要素にバインドされ、その他のデータの有効性を示すために、それ以外はかなりシンプルで簡単なダイアログが表示されます。

このコードの賛同者は、WPFを使用しているので、ビューモデルで単純なWPF固有の構文を使用できる可能性があると言います。

これは違反者Separation of Concernsに違反していると言われています。これは明らかにビューだけに注意すべきスタイルを明確に示しています。

上記のコードに満足できない場合は、別の解決策についてご意見をお寄せください。 (私は特にあなたがDataTemplateを使用することに関して何を言わなければならないかに興味があります)。

ベストプラクティスと考えられる解決策がありますか?

+0

これは 'DataTemplate'sと何が関係していますか? –

+0

@Reed Copsey:私は、特定の 'DataType'sにマップされた' DataTemplate'を使用することが、この問題の1つの代替解決策であるという印象を受けています。私はそれが使用されているか、あまりにも "ヘビー級"と考えているかどうかを知りたいです。 –

+0

'DataTemplate'を使用することは、実際にはブラシの変更を処理する適切な方法ではありません。実際には、カスタムタイプの表示方法を決定するためのものです。たとえば、カスタムクラスをそのクラス情報を適切に表示するように設計されたビューにマップするために使用できます。 –

答えて

8

個人的には、2つのブラシをXAMLで定義し、それらを使用するコントロールにIsValidプロパティに基づいて(xamlで)スイッチブラシを設定します。これは、DataTriggers、または単一のIValueConverterでも非常に簡単に行うことができます。コンバーターは2つのブラシとブール値を取り、それらの間を簡単にスワップすることができます。

これは、ビジネスロジックを中立に保ちます。「ブラシ」は、特定の形式のプレゼンテーションや、純粋なビューの選択に非常に特化しています。これをViewModelにハードコーディングすると、単一の責任の原則に違反するだけでなく、懸念が明確に分離されるわけでもありません。

私はこれをViewに保存し、ViewModel固有のIsValid(bound)プロパティに基づいて切り替えます。

+1

よく置いてください。ブラシを定義する場所に関して "ベストプラクティス"というフレーズを考えるつもりなら、答えはViewModelではなくDataTrigger/IValueConverterです。 –

2

ビューモデルでWPFコンストラクトを使用する場合がありますが、これはその1つではありません。その理由は次のとおりです。

  • 変更が難しいです。ブラシをリソースとして定義してスタイルで使用する場合は、アプリケーションの配色を変更するだけで別のリソースディクショナリを読み込むことができます。ビューモデルでカラー値をハードコードすると、エンドユーザーが異なる色を必要とする場合には、さまざまな変更が必要になります。

  • テストするのは難しいです。プロパティが適切なブラシを返すかどうかを確認する単体テストを作成する場合は、単位テストでブラシを作成し、そのブラシの参照値を比較する必要があります。

  • 多くの場合、たいていの場合でさえ、コードを単純化したり保守しやすくしていません。既にスタイルを使用している可能性は非常に高いです(スタイルに精通していると仮定して)、WPFですべてのことを簡単に行うためです。 IsValidをブラシカラーにバインドすることは、スタイルにDataTriggerを追加するだけです。このコードを管理している人なら誰でもそれを見つけることができます。

私はWPFは、ビューモデルで構築使用しない時間確かにあります - 例えば、ずっと前にビューモデルがタイプVisibilityのプロパティを公開した場合、それが問題だった場合疑問に停止したが。上記の懸念事項のいずれも該当しないことに注意してください。

0

純粋に審美的なあなたのような場合、私はトリガーまたはビジュアルステートマネージャーを使用して色を変更します。

私のViewModelsで色を使用していることがありますが、ソフトウェア仕様の一部(患者のCO2を表示しているグラフの色がローカリゼーションに依存しているなど)がある場合のみです。その場合、Color構造体のバインドされたプロパティを使用して、ViewがSolidColorBrush、GradientStopなどのためにColorを使用できるようにします。 WPFの依存関係を完全に削除するには、最初に#AARRGGBB形式の文字列を使用しましたが、私の経験豊富な同僚はそれを気に入らなかったのです。

関連する問題