メイン ビュー (上で説明したように、ベース プレートの .xaml ファイル) を持たないようにして、特定の子コントロールにDataContext
割り当てることができます。DataContext
UserControls
ただし、あなたの説明から、ViewModels でコンポジションを使用することを検討することをお勧めします。このシナリオでは、ChildViewModel (技術者とテスト) を表すプロパティを持つ MainViewModel があります。これらの子 ViewModel は、構成方法に応じて、MainViewModel を介して通信することも、通信しないこともできます。次に、DataContext
メイン ビューの は MainViewModel になり、UserControls
はDataBind
そのビュー モデルのプロパティになります。
次のようになります。
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 つの方法です。