C# WPF-单击按钮可重置某些选项卡控件选项卡

C# WPF-单击按钮可重置某些选项卡控件选项卡,c#,wpf,tabcontrol,caliburn.micro,C#,Wpf,Tabcontrol,Caliburn.micro,我使用Caliburn.Micro作为MVVM框架,我有一个应用程序,它有一个TabControl,每个Tab都是一个ViewModel(和View),上面有几个按钮,还有一个自定义的UserControl,我构建了一个,里面也有一个按钮。所有选项卡都具有相同的结构(它们使用相同的视图模型/视图) 问题是,出于某种原因,当我单击自定义用户控件内的按钮时,会重置其他选项卡-其中的控件重置为其初始值,数据网格被清除等。奇怪的是: 这种情况并不总是发生,也不总是发生在所有选项卡上,即使我注释掉User

我使用Caliburn.Micro作为MVVM框架,我有一个应用程序,它有一个TabControl,每个Tab都是一个ViewModel(和View),上面有几个按钮,还有一个自定义的UserControl,我构建了一个,里面也有一个按钮。所有选项卡都具有相同的结构(它们使用相同的视图模型/视图)

问题是,出于某种原因,当我单击自定义用户控件内的按钮时,会重置其他选项卡-其中的控件重置为其初始值,数据网格被清除等。奇怪的是:

这种情况并不总是发生,也不总是发生在所有选项卡上,即使我注释掉UserControl按钮的Click事件中的所有内容,也会发生这种情况(因此,只要引发Click事件,一些选项卡,有时所有选项卡都会无缘无故地重置)

我已经读到TabControl有一个奇怪的东西,在某些情况下它不会持久化数据,但是

a) 我认为情况并非如此,因为在选项卡之间切换时数据保持良好,单击按钮时数据就会消失

b) 即使是同一个问题,我也不能真正使用Google提供的解决方案,因为视图、视图模型和TabControl的绑定是由Caliburn.Micro完成的,我不能搞乱它是如何完成的(例如,我不能让TabControl使用新属性而不是一些帖子建议的ItemSource)

看起来它完全重置了整个视图,就好像应用程序刚刚启动一样。当我读到TabControl的持久性问题时,人们通常认为排序设置、选择等内容会被清除,但在这种情况下,整个选项卡会被清除,包括数据网格和其他所有内容的数据我注意到它只会重新创建视图(当切换回选项卡时会调用它们的构造函数),但是视图后面的视图模型不会


以前有其他人经历过吗?你做了什么?

我已经搜索了几个小时,但不知何故完全没有找到这个解决方案:


我不太清楚它是如何工作的,但在切换选项卡和按下任何按钮时,它会以某种方式阻止视图被重新创建。

一种解决方案可能是避免使用TabItems来保持控件。而是将TabItems保留为空,并将TabItems中通常会出现的所有控件添加到同一网格元素中,并将Panel.ZIndex设置为更高的值,以用于顶部所需的控件。例如:

<Window x:Class="testtab.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="testtab" Height="300" Width="300"
    >

    <Grid Name="Grid1">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>          
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>     
        </Grid.RowDefinitions>

        <Label Grid.Row="0" Content="Persistant State for UserControls" 
               Background="Blue" Foreground="Yellow"/>

        <TabControl Grid.Row="1" 
               Name="TabControl1"
               SelectionChanged="TabControl_SelectionChanged">
            <TabItem Header="Page1" />
            <TabItem Header="Page2" />
            <TabItem Header="Page3" />
        </TabControl>

        <!-- ZIndex: top=1; botton=0 -->
        <TextBox Name="b1" Grid.Row="2" Panel.ZIndex="1" Text="b1"/>
        <TextBox Name="b2" Grid.Row="2" Panel.ZIndex="0" Text="b2"/>
       <TextBox Name="b3" Grid.Row="2" Panel.ZIndex="0" Text="b3"/>     
    </Grid>

</Window>
我手边没有任何用户控件。。。所以我们使用文本框控件


事后想一想,您可能还需要控制每个控件的可见性属性,在“折叠”和“可见”之间进行选择。换句话说,如果控件未显示是因为其选项卡未被选中,则应将其可见性设置为“折叠”或“隐藏”,以免干扰顶部的选项卡。

也不知道此选项卡的工作原理。我在想,也许有一种方法可以从c#代码创建一个TabItem,并在进入或退出选项卡时分配SelectedItem,以确保TabItem是持久的,并且不会在选项卡选择之间被废弃。
void TabControl_SelectionChanged(
   object sender, 
   SelectionChangedEventArgs e)
{

    //need this if settings SelectedIndex on TabControl
    if (!IsInitialized) return; 

    switch(TabControl1.SelectedIndex) {
        case 0:
            Panel.SetZIndex(b1, 1);
            Panel.SetZIndex(b2, 0);
            Panel.SetZIndex(b3, 0);                             
            break;                  
        case 1:
            Panel.SetZIndex(b1, 0);
            Panel.SetZIndex(b2, 1);
            Panel.SetZIndex(b3, 0);                                                 
            break;
        case 2:
            Panel.SetZIndex(b1, 0);
            Panel.SetZIndex(b2, 0);
            Panel.SetZIndex(b3, 1);                                                 
            break;
    }
    e.Handled = true;
}