[英]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.