WPF TabControl选项卡丢失状态信息

时间:2014-03-11 20:58:17

标签: wpf mvvm binding user-controls tabcontrol

我对WPF很新,而且几乎是正面的我只是忽略了一些东西。我在选择时在选项卡中保留用户控件的状态时遇到问题。它似乎与this question非常相似,但它似乎没有得到解决。

在我的主ViewModel中,我有一个抽象TabableViewModel类的ObservableCollection。它还为TabControl的SelectedIndex实现了INotifyPropertyChanged。

我希望TabControl的内容能够自动创建,所以我使用了像这样的DataTemplate:

<Window.Resources>

    <DataTemplate DataType="{x:Type vm:EasyViewModel}">
        <UserControls:EasyControl/>
    </DataTemplate>
    <DataTemplate DataType="{x:Type vm:ComplicatedViewModel}">
        <UserControls:ComplicatedControl/>
    </DataTemplate>
    <DataTemplate x:Key="TabHeaderTemplate">
        <Grid>
            <TextBlock Text="{Binding HeaderText}" />
        </Grid>
    </DataTemplate>
    <Style x:Key="TabItemStyle" TargetType="TabItem">
        <Setter Property="Header" Value="{Binding}" />
        <Setter Property="HeaderTemplate" Value="{StaticResource TabHeaderTemplate}" />
        <Setter Property="Content" Value="{Binding}" />
    </Style>
</Window.Resources>
<TabControl x:Name="contentTab" TabStripPlacement="Bottom" 
      SelectedIndex="{Binding SelectedTabIndex, Mode=TwoWay}"
      ItemsSource="{Binding TabItems, Mode=TwoWay}" 
      ItemContainerStyle="{StaticResource TabItemStyle}">
</TabControl>

EasyControl和ComplicatedControl都有许多文本框,组合框和其他字段。两个ViewModel都扩展了TabableViewModel类并实现了INotifyPropertyChanged。

在典型测试中,ObservableCollection将包含一个EasyViewModel实例,然后包含两个ComplicatedViewModel实例。标签正确构建,但未维护ViewModel的状态。

如果我在EasyControl中进行更改,请切换到第一个ComplicatedControl选项卡,然后切换回来,所有数据都已丢失。

如果我对第一个ComplicatedControl进行更改并切换到第二个,我会得到相同的更改,而不是空白的平板。如果我再切换到EasyControl并再次返回,则会再次清除所有数据。

我已经看过很多DataTemplates基本的例子,但我还没有看到基于ViewModel类型选择UserControls的地方。我需要做些什么才能维持状态?

我不想通过在ViewModels中创建UIElements来打破MVVM模式。我也希望我不必延长任何Tab控件以使其正常工作,但如果必须,我会这样做。我很惊讶这很难做到。

1 个答案:

答案 0 :(得分:0)

因此,您的UI似乎正在丢失数据。使用MVVM时通常无法做到这一点,因为您的数据位于视图模型中且视图。因此,如果它在任何时候被重置,那么你的代码正在重置它。你说:

  

我的问题来自于标签之间的切换

因此,当您切换标签时,您必须初始化一个视图模型,以及它丢失数据的原因。您是唯一一个可以解决此问题的人......它无法从您的代码示例中重现。搜索对视图模型构造函数的调用,您应该找到问题所在。