控制WPF中不同的DataContext
我可以在不同的选项卡中部署多个DataContext并控制哪个是当前的DataContext。
我正在使用Mvvm Light WPF4,我有不同的ViewModels和View,但我不知道如何处理多个DataContext并控制当前的DataContext以便在切换选项卡时进行更改。
编辑:
我已经有了解决方案的方法,具体如下:
- 为MainView创建一个ViewModel
- TabControl源是ObservableCollection
- 每个TabItem都有自己的DataContext
- 菜单的DataContext如下:
DataContext="{Binding Path=CurrentTab.DataContext}"
,其中CurrentTab在ViewModel中添加新的TabItem时会更改
我遇到了以下问题:
- 当您更改选项卡时,如何连接TabControl的ViewModel?
解决方案:问题在于Mvvm Light使用ViewModelLocator以静态方式绑定ViewModel,在C#中添加选项卡时这就是问题所在,另外我需要手动加载每个选项卡的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)发送必要的参数。