0

私は WPF/MVVM で標準的なデータ入力アプリに取り組んでいます。LabSetupView.xaml というファイルがあり、その中に次の 3 つのコントロールがあります。

  1. 利用可能な Labs を表示する ComboBox
  2. 技術者を表示するための ComboBox
  3. テスト用の ListView

これらのコントロールは連携して動作することを意図しています。ユーザーが技術者を選択すると、その TechnicianId のテストのみが表示されます。これは、Technician to Tests のナビゲーション プロパティを介して行われます。

LabSetupView.xamlの DataContext は 1 回しか設定できないため、これらのコントロールをそれぞれ独自の .xaml ファイルに移動し、<UserControl>内部にネストすることを検討しています。<Window>したがって、コントロールをコンポーネント化すれば、それぞれに ViewModels (つまり、LabView.xaml/LabViewModel.xaml など) を作成し、必要なINotifyPropertyChanged.

私の質問は次のとおりです。それ自体がデータ コンテキストを持たず、それぞれが独自のデータ コンテキストを持つ個別の UserControls を含むベース プレート .xaml ファイルを持つことは、一般的または通常の方法ですか?

このようなことを試みた場合、これらのビューがコンポーネント化されているため、データバインディングと INotifyProperChanged が連携しないのではないかと心配しているため、これを尋ねています。つまり、上記のユース ケース (技術者のテストを取得する) は、プロパティをバインドまたは更新しません。

4

1 に答える 1

3

メイン ビュー (上で説明したように、ベース プレートの .xaml ファイル) を持たないようにして、特定の子コントロールにDataContext割り当てることができます。DataContextUserControls

ただし、あなたの説明から、ViewModels でコンポジションを使用することを検討することをお勧めします。このシナリオでは、ChildViewModel (技術者とテスト) を表すプロパティを持つ MainViewModel があります。これらの子 ViewModel は、構成方法に応じて、MainViewModel を介して通信することも、通信しないこともできます。次に、DataContextメイン ビューの は MainViewModel になり、UserControlsDataBindそのビュー モデルのプロパティになります。

次のようになります。

public class MainViewModel : BaseViewModel
{
    public TechnicianViewModel Technician { get { return _technician; } }
    public TestViewModel Test { get { return _test; } }
    ...
}

XAML の簡略化された例は次のようになります (MainViewModel がウィンドウの DataContext として設定されていると仮定します)。

<Window x:Class="MainView"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

      <StackPanel>
           <local:TechnicianView DataContext="{Binding Technician}"/>
           <local:TestView DataContext="{Binding Test}"/>
      </StackPanel>

</Window>

これは、上記のタイプのシナリオに対処した方法であり、うまく機能します。IoC/DI を使用して、IoC コンテナーを介して子ビュー モデルを挿入できる場合は、非常にうまく機能します。

編集済み

以下のコメント/質問に基づいて、いくつかの追加の詳細。選択した技術者とその技術者が利用できるテストとの関係を確立する方法を尋ねます。これを処理する 1 つの方法は、TestsViewModel を TechnicanViewModel の子にすることです。したがって、たとえば、次のようにすることができます。

public class MainViewModel : BaseViewModel
{
    public IEnumerable<TechnicianViewModel> AvailableTechnicians { get { return _technicians; } }
    public TechnicianViewModel SelectedTechnician 
    { 
        get { return _selected; } 
        set 
        { 
            _selected = value; 
            RaiseNotifyPropertyChanged("SelectedTechnician");
        } 
    }
    ...
}

public class TechnicianViewModel : BaseViewModel
{
    public IEnumerable<TestViewModel> Tests { get { return _tests; } }
}

そして、XAML で:

<StackPanel>
     <ListBox ItemsSource="{Binding AvailableTechnicians}" SelectedItem="{Binding SelectedTechnician, Mode=TwoWay}"/>
     <ListBox ItemsSource="{Binding SelectedTechnician.Tests}"/>
</StackPanel>

ListBoxこれにより、テストが Technicians で選択された技術者と同期されListBoxます。これは単なる例です (間違いがあれば VS ではなく、テキスト エディターで記述されています) が、議論している種類の関係を処理する 1 つの方法です。

于 2013-02-22T16:16:16.320 に答える