3
これらのユーザーコントロールが1回しか使用されない場合でも、ユーザーコントロールを使用してWPFフォームを構造化することは良い習慣ですか?
私はMVVMを使用してWPFアプリケーションを開発していて、最善の方法を学んでいます。 セレクター付きのWPFフォーム、検索フィールド付きの2つのリスト、およびその他の要素があります。現在、すべてが1つの形式になっており、機能します。しかし、今ではそのフォームのVMは800行を超えており、まだ完成していません。 このフォームとコードをよりよく構成したいと思います。リージョン、部分クラスを含むファイル、ユーザーコントロールについて考えました。ユーザーコントロールは、いくつかのコントロールとロジックをカプセル化しているため、最適だと思います。ユーザーコントロールを使用すると、そのウィンドウとVMのコード量が大幅に削減されます。 これを正しく行うために、「Pro WPF 4.5 In C#4th Edition」という本の第18章-カスタム要素とColorPickerUserControlサンプルに取り組みます。サンプルは、3つのスライダーを備えたカラーピッカーに関するもので、150行のコードが含まれています。 私はそれがどのように機能するか理解していると思いますが、そのサンプルのように機能が非常に制限されていても、ユーザーコントロールを作成するのは大変な作業だと思います。これらのコントロールを数回使用する場合、これを行うのが理にかなっていることを理解しています。しかし、コントロールを1回だけ使用し、これをフォームの構造化のみに使用する場合、これはほとんど利益を得るために多くの作業と思われます。 私の質問は次のとおりです。これらのユーザーコントロールが1回だけ使用される場合でも、ユーザーコントロールを使用してフォームを構造化することは良い習慣ですか?そうでない場合、より良い代替手段はありますか? 編集(読む必要はありませんが、詳細情報のみ):原則について学びたかったので、これまで詳細は書きませんでしたが、26の興味深い答えの17を読んだ後、ここにいくつかの詳細があります:このフォームは、音楽のタイトルを選択するためのものです。 グループA:(可能なユーザーコントロールA)は、アーティストまたはアルバムによる選択、ビデオの有無にかかわらず、おそらく発行年など、選択のタイプについてです。 グループB:このリストには、Aの基準に従ってフィルタリングされたアーティスト名が含まれています。ユーザーはリストをフィルタリングできます。つまり、「トップ」を含むアーティスト名のみを表示できます。 グループC:このリストには、Aの基準(オーディオまたはビデオ)を使用して、Bで選択したアーティストのタイトルが表示されます。Bと同様にフィルタリングできます。つまり、「あなた」を含むタイトルのみです。 ほとんどのロジックはVM(フォームのDataContext)で発生します。AとBのリストはデータベースからのものです。リストはフィルタリングされ、プレゼンテーション用に準備されます(つまり、同じ名前であるが異なるアルバムにある複数のタイトル)。ユーザーは、ダブルクリックしてCリストのタイトルを選択するか、別のWPFフォームにドラッグアンドドロップします。 必要なもの:簡単に修正できるように、読み取り可能なコードが必要です。別のフィルターを追加する場合、つまり女性アーティストのみを表示する場合は、ユーザーコントロールAに移動して、男性および/または女性アーティストのチェックボックスを追加するだけでよいとしましょう。 現在の形式のXAMLは問題なく、適切に構造化されています。ただし、VMには上記すべてのコードが含まれています。コンストラクター、コマンドセクション、プロパティ、バッキングフィールドにいくつかあります。私は今でも物事を見つけることができますが、コードがより構造化されていればもっと良いと思います。これがユーザーコントロールについて考える理由です。 MVVMの背後にあるロジックは非常に理にかなっていると思うので、MVVMをフォローしようとしています。しかし、私は理論的な実践の熱狂的な信者ではありません。つまり、VMで5行のCodeBehindまたは50行で何かを実行できる場合、CodeBehindで実行する可能性があります。私の質問は、WPFで構造化フォームを作成する方法の原則についてです。上記で説明したフォームは良い例ですが、答えはこの1つのフォームに集中するのではなく、WPFフォームを構成する方法、つまりユーザーコントロールを使用する(または使用しない)方法に集中する必要があります。 ユーザーコントロールが多くの作業を必要とする理由について:依存関係プロパティ、ルーティングイベントなどがあります。これはすべて、バッキングフィールドとINotifyを使用した「通常の」プロパティよりもはるかに複雑に思えます。しかし、依存関係プロパティ、ルーティングイベントなどに慣れる必要があるだけかもしれません。