在 WPF 中控制不同的 DataContext
因为我可以在不同的选项卡中部署多个 DataContext 并控制哪个是当前 DataContext
我正在使用Mvvm Light WPF4我有不同的 ViewModel,View 但我不知道如何处理多个 DataContext 并控制当前 DataContext 以在选项卡开关上进行更改
编辑:
我有一个解决方案的方法如下:
- 为 MainView 创建一个 ViewModel
- tabcontrol 源是 ObservableCollection
- 每个 TabItem 都有自己的 DataContext
- 菜单的 DataContext 如下所示:
DataContext="{Binding Path=CurrentTab.DataContext}"
where CurrentTab change when add new TabItem in ViewModel
我有以下问题:
- 更改选项卡时如何从 TabControl 连接 ViewModel?
解决方案:问题是 Mvvm Light 使用 ViewModelLocator 以静态方式绑定 ViewModel,这是当我在 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)发送必要的参数