WPF で異なる DataContext を制御する
さまざまなタブに複数の DataContext を展開し、現在の DataContext を制御できるため
私はMvvm Light WPF4を使用しています。さまざまな ViewModels、View がありますが、複数の DataContext を処理し、タブ スイッチで変更するために現在の DataContext を制御する方法がわかりません。
編集:
私は次のように解決策へのアプローチを持っています:
- MainView の ViewModel を作成する
- タブコントロールのソースは ObservableCollection です
- 各 TabItem には独自の DataContext があります
- メニューには、次のような DataContext があります
DataContext="{Binding Path=CurrentTab.DataContext}"
。ViewModel に新しい TabItem を追加すると、CurrentTab が変更されます。
私は次の問題を抱えています:
- タブを変更するときに、TabControl から ViewModel を接続するにはどうすればよいですか?
解決策: 問題は、Mvvm Light が静的な方法で ViewModel をバインドするために ViewModelLocator を使用することです。これは、C# でタブを追加すると ViewModelLocator が機能しないという問題です。他の方法では、次のように各タブの ViewModel を手動でロードする必要があります。
// in MainModelView.cs
public RelayCommand MyCommand { get; set; }
private void RegisterCommand()
{
MyCommand = new RelayCommand(() =>
{
AddTab("Tab Header", new TabViewModel(), new TabContentControl());
});
}
private void AddTab(string header, object context, ContentControl content)
{
TabItem = null;
foreach(TabItem tab in TabItemList)
{
if(tab.Header.Equals(header);
{
tabItem = tab;
}
}
if(null == tabItem)
{
tabItem = new TabItem();
tabItem.Header = header;
tabItem.Content = content;
tabItem.DataContext = context;
TabItemList.Add(tabItem);
}
CurrentTabIndex = TabItemList.IndexOf(tabItem);
}
2. メニューで DataContext が更新されません。コードが間違っていますか?
解決策:前のポイントもこれを解決し、次のコードを解決するだけです:
// in RegisterCommands()
ChangeTabCommand = new RelayCommand<TabItem>(tab =>
{
if (null == tab) return;
CurrentTabContext = tab.DataContext;
}
MainWindow.xml で:
<!-- MainWindow.xaml -->
<Button Content="NewTab" Command="{Binding Path=MyCommand }" />
<TabControl
Margin="5 5 5 0"
Grid.Row="1"
ItemsSource="{Binding Path=TabItemList}"
SelectedIndex="{Binding Path=CurrentTabItemIndex}"
x:Name="Workspace">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<cmd:EventToCommand
Command="{Binding ChangeTabCommand }"
CommandParameter="{Binding SelectedItem, ElementName=Workspace}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</TabControl>
編集2:
- ViewModel でのビューの変更を回避し、同じビュー (ContenControl、Header、Context) から必要なパラメーターを送信する方法