WPF MVVM:设置选项卡视图的 DataContext

2023-12-29

我经历了所描述的奇怪的绑定行为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?


你不必指定vm:Tab1ViewModelXAML 中的新实例。您也不需要定义DataContext明确地。您列表中的每一项都是ViewModel每当 a 的类型ViewModel与您定义的类型匹配DataTemplate颗粒物view将被渲染并具有相同的DataContext as ViewModel。例如,如果列表有两个如下所示的对象:

public ObservableCollection<TabViewModelBase> TabList { get; set; }
public MainViewModel()
{
    this.TabList = new ObservableCollection<TabViewModelBase>();
    this.TabList.Add(new Tab1ViewModel1()); 
    this.TabList.Add(new Tab1ViewModel2()); 
}

和你的DataTemplate is :

<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>

...

然后将呈现两个选项卡Tab1 & Tab2(原因列表有 2 项)。Tab1将会有Tab1ViewModel1as DataContext和和Tab2将会有Tab1ViewModel2 as DataContext。您无需指定DataContext明确地。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF MVVM:设置选项卡视图的 DataContext 的相关文章

随机推荐