我经历了所描述的奇怪的绑定行为here https://stackoverflow.com/questions/37068521/wpf-mvvm-strange-binding-behavior。我做了很多故障排除,得出的结论是最有可能的问题在于我如何设置DataContext
每个选项卡的视图。
我有一个TabControl
whose 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 方法。风景 (Tab1
) for TabViewModelBase
定义为使用DataTemplate
.
这就是问题所在:
Tab1:
<UserControl.Resources>
<vm:Tab1ViewModel x:Key="VM" />
</UserControl.Resources>
<UserControl.DataContext>
<StaticResourceExtension ResourceKey="VM" />
</UserControl.DataContext>
我想大多数人也会这么做,但是……
有东西严重错误用这种方法!
In MainViewModel
,我手动实例化了一个Tab1ViewModel
. In MainView
, 我用了DataTemplate
告诉视图使用Tab1
每当它看到一个Tab1ViewModel
。这意味着MainView
会实例化一个对象Tab1
class.
Now, Tab1
需要它的DataContext
与其自己的进行绑定Tab1ViewModel
,所以我们使用StaticResource
添加一个Tab1ViewModel
,但这是一个全新的实例!
我需要设置DataContext
回到我实例化的原始状态MainViewModel
。那么,我该如何设置DataContext
of Tab1
within DataTemplate
?