【发布时间】:2018-04-14 02:01:00
【问题描述】:
我遇到了here 描述的奇怪绑定行为。我做了很多故障排除,得出的结论是,最可能的问题在于我如何设置每个选项卡视图的DataContext。
我有一个TabControl,其ItemsSource 绑定到ViewModels 列表。
MainView:
<TabControl ItemsSource="{Binding TabList}">
<TabControl.Resources>
<DataTemplate DataType="{x:Type vm:Tab1ViewModel}">
<v:Tab1 />
</DataTemplate>
</TabControl.Resources>
...
</TabControl>
MainViewModel:
public ObservableCollection<TabViewModelBase> TabList { get; set; }
public MainViewModel()
{
this.TabList = new ObservableCollection<TabViewModelBase>();
// Tab1ViewModel is derived from TabViewModelBase
this.TabList.Add(new Tab1ViewModel());
}
所以,现在MainViewModel 有一个TabViewModelBase 列表,我相信这是正确的 MVVM 方法。 TabViewModelBase 的视图 (Tab1) 使用 DataTemplate 定义。
这就是问题所在:
Tab1:
<UserControl.Resources>
<vm:Tab1ViewModel x:Key="VM" />
</UserControl.Resources>
<UserControl.DataContext>
<StaticResourceExtension ResourceKey="VM" />
</UserControl.DataContext>
我想大多数人也会这样做,但是... 这种方法存在严重错误!
在MainViewModel 中,我手动实例化了Tab1ViewModel。在MainView 中,我使用DataTemplate 告诉视图在看到Tab1ViewModel 时使用Tab1。这意味着MainView 将实例化Tab1 类的对象。
现在,Tab1 需要它的DataContext 与它自己的Tab1ViewModel 进行绑定,所以我们使用StaticResource 来添加一个Tab1ViewModel,只不过这是一个全新的实例!
我需要将DataContext 设置回我在MainViewModel 中实例化的原始值。那么,如何在DataTemplate 中设置Tab1 的DataContext?
【问题讨论】:
-
只需删除您为 Tab1 显示的所有资源和 DataContext 代码。您的 Viewmodel 实例在您的 Collection 中,DataTemplate 在您的 TabControl 资源中定义
-
那么我的
Tab1将没有DataContext,我将无法在Tab1和Tab1ViewModel之间进行任何绑定。
标签: wpf mvvm datatemplate tabcontrol datacontext