繁体   English   中英

WPF-单击按钮会重置一些TabControl选项卡

[英]WPF - Clicking a button resets some TabControl tabs

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

问题是,由于某种原因,当我单击自定义UserControl中的按钮时,该按钮会重置其他选项卡-内部的控件重置为其初始值,DataGrid被清除等。关于这的奇怪的事情是:

即使并非我注释掉UserControl按钮的Click事件中的所有内容,它也不会总是发生在所有选项卡上,也不会总是发生(因此,仅通过引发Click事件,某些选项卡有时甚至全部重置为否)就不会发生原因)。

我读到TabControl有点奇怪,它在某些情况下不能持久保存数据,但是

a)我认为情况并非如此,因为当在选项卡之间切换时,数据仍然可以正常工作,而当我单击按钮时,数据就消失了

b)即使是同一问题,我也无法真正使用Google提供的解决方案,因为Views,ViewModels和TabControl的绑定是由Caliburn.Micro完成的,我无法弄清楚它的工作方式(因此,例如,我不能使TabControl使用新属性而不是某些帖子所建议的ItemSource)。

好像它完全重设了整个视图,就好像该应用程序刚刚启动一样。 当我阅读TabControl的持久性问题时,人们通常表示会清除排序设置,选择之类的内容,但是在这种情况下,整个选项卡都会被清除,包括DataGrids的数据和其他所有内容。 我注意到它仅重新创建视图(切换回其选项卡时将调用其构造函数),但视图后面的ViewModels不会!

之前有没有其他人经历过? 你做了什么?

我一直在搜索数小时,以某种方式完全错过了此解决方案: 阻止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>

这是相关的事件处理程序:

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

我没有任何方便的UserControls ...所以我们正在使用TextBox控件...

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM