我对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控件以使其正常工作,但如果必须,我会这样做。我很惊讶这很难做到。
答案 0 :(得分:0)
因此,您的UI似乎正在丢失数据。使用MVVM时通常无法做到这一点,因为您的数据位于视图模型中且不视图。因此,如果它在任何时候被重置,那么你的代码正在重置它。你说:
我的问题来自于标签之间的切换
因此,当您切换标签时,您必须初始化一个视图模型,以及它丢失数据的原因。您是唯一一个可以解决此问题的人......它无法从您的代码示例中重现。搜索对视图模型构造函数的调用,您应该找到问题所在。