C# WPF-单击按钮可重置某些选项卡控件选项卡
我使用Caliburn.Micro作为MVVM框架,我有一个应用程序,它有一个TabControl,每个Tab都是一个ViewModel(和View),上面有几个按钮,还有一个自定义的UserControl,我构建了一个,里面也有一个按钮。所有选项卡都具有相同的结构(它们使用相同的视图模型/视图) 问题是,出于某种原因,当我单击自定义用户控件内的按钮时,会重置其他选项卡-其中的控件重置为其初始值,数据网格被清除等。奇怪的是: 这种情况并不总是发生,也不总是发生在所有选项卡上,即使我注释掉UserControl按钮的Click事件中的所有内容,也会发生这种情况(因此,只要引发Click事件,一些选项卡,有时所有选项卡都会无缘无故地重置) 我已经读到TabControl有一个奇怪的东西,在某些情况下它不会持久化数据,但是 a) 我认为情况并非如此,因为在选项卡之间切换时数据保持良好,单击按钮时数据就会消失 b) 即使是同一个问题,我也不能真正使用Google提供的解决方案,因为视图、视图模型和TabControl的绑定是由Caliburn.Micro完成的,我不能搞乱它是如何完成的(例如,我不能让TabControl使用新属性而不是一些帖子建议的ItemSource) 看起来它完全重置了整个视图,就好像应用程序刚刚启动一样。当我读到TabControl的持久性问题时,人们通常认为排序设置、选择等内容会被清除,但在这种情况下,整个选项卡会被清除,包括数据网格和其他所有内容的数据我注意到它只会重新创建视图(当切换回选项卡时会调用它们的构造函数),但是视图后面的视图模型不会强>C# WPF-单击按钮可重置某些选项卡控件选项卡,c#,wpf,tabcontrol,caliburn.micro,C#,Wpf,Tabcontrol,Caliburn.micro,我使用Caliburn.Micro作为MVVM框架,我有一个应用程序,它有一个TabControl,每个Tab都是一个ViewModel(和View),上面有几个按钮,还有一个自定义的UserControl,我构建了一个,里面也有一个按钮。所有选项卡都具有相同的结构(它们使用相同的视图模型/视图) 问题是,出于某种原因,当我单击自定义用户控件内的按钮时,会重置其他选项卡-其中的控件重置为其初始值,数据网格被清除等。奇怪的是: 这种情况并不总是发生,也不总是发生在所有选项卡上,即使我注释掉User
以前有其他人经历过吗?你做了什么?我已经搜索了几个小时,但不知何故完全没有找到这个解决方案:
我不太清楚它是如何工作的,但在切换选项卡和按下任何按钮时,它会以某种方式阻止视图被重新创建。一种解决方案可能是避免使用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;
}