1

MVVM でコードをレイアウトする方法について少し混乱しています。対応する VM クラスを持つ UserControl がある場合、他のコントロールはどのように UserControl を使用する必要がありますか?

コンシューマーは VM に直接バインドする必要がありますか、それとも、UserControl の DependencyProperties として実際に使用したいこれらのプロパティのサブセットのみを複製する必要がありますか?

さらに言えば、UserControl の VM を UserControl のコード ビハインドに挿入する必要がありますか、それともこの UserControl を使用するコントロールの VM にそれを依存関係として含め、代わりに UserControl にバインドする必要がありますか?

明確にするために、UserControl に ListBox があり、MVVM で既に実装されている Window でそれを使用するとします。しかし、UserControl VM と対応するバインディングの実装について混乱しています。

理想的な解決策は、UserControl の依存関係プロパティを介して ListBox の SelectedItems を公開し、UserControl を使用する Window をこれらにバインドすることだと思います。

または、ウィンドウの VM は VM への参照をプロパティとして持つ必要がありますか?代わりに、それを挿入してそのプロパティに直接バインドする必要がありますか?

依存関係プロパティは UserControls でのみ定義する必要がありますか、それとも VM で定義できますか?

Window の XAML 内から、Window がバインドされると考えています。

{Binding ElementName=myUserControl, Path=SelectedItems}

また

{Binding Path=MyViewModel.SelectedItems} 

後者はViewが別のVMについて知っている必要があるため、前者を介して行う方が理にかなっているようです?

4

2 に答える 2

2

>他のコントロールは私のUserControlをどのように消費する必要がありますか?

ユーザーコントロールのみの公開された依存関係プロパティを介して。

>コンシューマーはVMに直接バインドする必要がありますか、それともUserControlのDependencyPropertiesとして実際に使用したいこれらのプロパティのサブセットのみを複製する必要がありますか?

各コントロールはスタンドアロンエンティティである必要があり、コントロールを使用するための秘密のハンドシェイク(toまたはfrom)があってはなりません。あなたがマイクロソフトであり、多くの異なるユーザーがあなたのコントロールを使用するようにデザインを考えてください。したがって、回答#1も同様に関連性があります。スタンドアロンのエンティティを考えてください。

>理想的な解決策は、UserControlの依存関係プロパティを介してListBoxのSelectedItemsを公開し、UserControlを使用するウィンドウがこれらにバインドすることだと思います。

コントロールをホストするウィンドウには、データ項目の監視可能なリストを含むビューモデルがあります。これは、ユーザーコントロールが依存関係プロパティを介してバインドするデータを保持します。多くの消費者がいるプロデューサーパターンとして考えてください。消費者はコントロールです。コントロールにVMがあるかどうかは、メインプログラムの実行には重要ではありません。各コントロールは独自の島です。

于 2012-11-08T14:57:01.457 に答える
2

WPF と MVVM を使用する場合、Viewレイヤーは単に と を描画するユーザー フレンドリーな方法でModelsありViewModelsView実際にはアプリケーションではないことに注意してください。データレイヤーの描画方法Viewを定義できるように、データレイヤーの基本を実際に知っている必要があります。

したがって、アプリケーションが のリストを表示してItems維持するSelectedItem必要がある場合は、実際の View レイヤーではなく、ViewModel または Model のどこかにある必要があります。

通常、私にとって UserControls は次の 2 つのいずれかです。

  • UserControl特定の なしでどこでも使用でき、コントロール固有の値DataContextを公開するスタンドアロン。DependencyProperties例は、CalendarコントロールまたはコントロールのPopupようなものです

    <local:MyUserControl Items="{Binding SomeItemList}" 
                         SelectedItem="{Binding SomeItem}" />
    
  • またはUserControl、特定のものだけで使用することを意図したViewModelです。これは私にとってはるかに一般的です。ViewModel はデータ層のどこかにあるプロパティです。私は通常、特定のレンダリングが必要なときはいつでもそれDataTemplateを使用するように WPF に指示するために、アプリケーションのどこかに暗黙的に設定しています。UserControlViewModel

    <DataTemplate DataType="{x:Type local:SomeViewModel}">
        <local:MyUserControl />
    </DataTemplate>
    
    <ContentPresenter Content="{Binding SomeViewModelProperty}" />
    

また、 UI レイヤーはデータ レイヤー ( / )の UI 表現のみを意図しているため、それ自体の内部からDataContextaを設定しないでください。を使用して他のデータ オブジェクトを描画することはできません。UserControlUserControlModelsViewModelsUserControlUserControl

于 2012-11-08T15:34:08.477 に答える