0

この質問は、MVVM を念頭に置いてアプリの設計を考慮に入れる方法に関するものです。MVVM の一般的な概念を理解しています (ViewModel は View を認識していない、モデルはドメイン オブジェクトを表すなど)。また、コマンドと、一部のコントロールが ViewModel でコマンドを呼び出す方法についても認識しています。

私が理解できないのは、実際のアプリをこのモデルに適合させる方法です (単純なテキスト ボックス/ボタン/クエリ データベースの例とは対照的に)。ここにいくつかの質問があります:

  • メイン ビューには、ユーザーが何をしているかに応じてコンテキスト データを表示するプレビュー セクションがあります (つまり、特定のコントロールを操作することによって、いくつかのプレビュー セクションを表示します)。ビューには、XAML で可能なすべてのプレビューを含めてから、表示/非表示/更新する必要がありますか? ViewModel には、ViewModel の内部ステート マシンによって設定された "public bool ShowPreviewA" や "public bool ShowPreviewB" などのプロパティが必要ですか?
  • コントロール間に複雑な相互作用がある場合、ロジックをどこに置くべきか。たとえば、チェックを外すのを防ぐことによって、少なくとも 1 つを選択する必要がある 3 つのチェックボックス。一方ではViewModelを汚染し、他方ではViewに関する特定の「知識」があるように感じます。

この質問を適切に説明するのは困難です (できれば、MVVM をよりよく理解できるでしょう)。

どんなヒントでも大歓迎です。

編集: 本当の問題は、ViewModels の機能を記述するときに問題をどのように解決するかです。トップダウン (つまり、ViewModel プロパティですべての可能なビュー状態をエンコード) とボトムアップ (つまり、論理的に関連するコントロールの各セットは、いくつかの論理状態 (有効な入力など) を報告する子 ViewModel からプロパティを受け取ります) の組み合わせですか? ?

4

1 に答える 1

1

メイン ビューには、ユーザーが何をしているかに応じてコンテキスト データを表示するプレビュー セクションがあります (つまり、特定のコントロールを操作することによって、いくつかのプレビュー セクションを表示します)。ビューには、XAML で可能なすべてのプレビューを含めてから、表示/非表示/更新する必要がありますか? ViewModel には、ViewModel の内部ステート マシンによって設定された "public bool ShowPreviewA" や "public bool ShowPreviewB" などのプロパティが必要ですか?

いいえ、もちろんそうではありません。これらの「プレビュー」が完全に異なるデータを持つ完全に異なる UI である場合は、DataTemplates.

例えば:

いくつかのクラスを考えると:

public class Person: BusinessEntity //BusinessEntity is just a fictional base class for Model classes
{
    public string LastName {get;set;}
}

public class Product: BusinessEntity
{
    public string ProductName {get;set;
}

ViewModel が次のように定義されているとします。

public class SomeViewModel: ViewModelBase //Same comment as above
{
    public BusinessEntity SelectedEntity {get;set;} //NotifyPropertyChanged() etc
}

XAML は次のように定義できます。

<Window ...>
   <Window.Resources>

       <!-- DataTemplate for Person class -->
       <DataTemplate DataType="Person">
           <TextBox Text="{Binding LastName}"/>
       </DataTemplate>

       <!-- DataTemplate for Product class -->
       <DataTemplate DataType="Product">
           <TextBox Text="{Binding ProductName}"/>
       </DataTemplate>
   </Window.Resources>

   <ContentPresenter Content="{Binding SelectedEntity}"/>

</Window>

WPF は、ViewModel のプロパティに配置されてDataTemplateいるContentPresenterオブジェクト タイプに応じて、適切なオブジェクトをレンダリングします。SelectedEntity


コントロール間に複雑な相互作用がある場合、ロジックをどこに置くべきか。たとえば、チェックを外すのを防ぐことによって、少なくとも 1 つを選択する必要がある 3 つのチェックボックス。一方ではViewModelを汚染し、他方ではViewに関する特定の「知識」があるように感じます。

簡単に継承ObservableCollection<T>して、再利用可能な方法でこのロジックを作成できます。次に、ViewModelpublic SelectableCollection<T> MyItems {get;set;}で、選択/相互排除などが処理される場所などをいくつか配置SelectableCollectionします。

結論: MVVM は、機能の再利用性とカプセル化がすべてです。

于 2013-07-05T19:50:19.710 に答える