Jai*_*Jai 0 wpf datacontext tabcontrol datatemplate mvvm
我遇到了一种奇怪的绑定行为,这里描述了。我做了很多故障排除,我得出的结论是,最可能的问题在于我如何设置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());
}
Run Code Online (Sandbox Code Playgroud)
所以,现在MainViewModel
有一个列表TabViewModelBase
,我相信这是正确的 MVVM 方法。视图 ( Tab1
)TabViewModelBase
是使用 定义的DataTemplate
。
这就是问题所在:
Tab1:
<UserControl.Resources>
<vm:Tab1ViewModel x:Key="VM" />
</UserControl.Resources>
<UserControl.DataContext>
<StaticResourceExtension ResourceKey="VM" />
</UserControl.DataContext>
Run Code Online (Sandbox Code Playgroud)
我想大多数人也会这样做,但是......这种方法有一些非常错误的地方!
在 中MainViewModel
,我手动实例化了一个Tab1ViewModel
. 在 中MainView
,我曾经DataTemplate
告诉 ViewTab1
在看到 a 时使用a Tab1ViewModel
。这意味着MainView
将实例化一个Tab1
类对象。
现在,Tab1
需要它DataContext
和自己的绑定Tab1ViewModel
,所以我们使用StaticResource
添加一个Tab1ViewModel
,除了这是一个全新的实例!
我需要将DataContext
返回设置为我在MainViewModel
. 那么,我如何设置DataContext
ofTab1
内DataTemplate
?
您不必vm:Tab1ViewModel
在 XAML 中指定新实例。您也不需要DataContext
明确定义。列表的每个项目是ViewModel
每当一个类型ViewModel
与你所定义的类型相匹配DataTemplate
的微粒view
会被渲染和相同DataContext
的ViewModel
。例如,如果列表有两个对象,如下所示:
public ObservableCollection<TabViewModelBase> TabList { get; set; }
public MainViewModel()
{
this.TabList = new ObservableCollection<TabViewModelBase>();
this.TabList.Add(new Tab1ViewModel1());
this.TabList.Add(new Tab1ViewModel2());
}
Run Code Online (Sandbox Code Playgroud)
你DataTemplate
是:
<TabControl ItemsSource="{Binding TabList}">
<TabControl.Resources>
<DataTemplate DataType="{x:Type vm:Tab1ViewModel}">
<v:Tab1 />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:Tab1ViewModel2}">
<v:Tab2 />
</DataTemplate>
</TabControl.Resources>
Run Code Online (Sandbox Code Playgroud)
...
然后两个选项卡将呈现
Tab1
&Tab2
(原因列表中有2项)。Tab1
将有Tab1ViewModel1
作为DataContext
,并与Tab2
将有Tab1ViewModel2
作为DataContext
。您无需DataContext
明确指定。
归档时间: |
|
查看次数: |
2936 次 |
最近记录: |