我正在遵循这里的一些指示:
我在窗口中显示用户控件。用户控件包含多个控件,验证时(我的意思是,用户已输入所有数据)我需要显示另一个用户控件。
我正在使用类似边框的容器。
答案 0 :(得分:1)
这是一种方法。我不知道这是最好的方式,但是我也不知道这种设计UI的方式是否一切都好。例如,如果我将有效数据放入其中时控制消失,如果我发现错误,如何将其恢复?巫师有一个“后退”按钮是有原因的。
首先,创建一个公开布尔IsValid
属性的基本视图模型类。 (在我的示例中,我将其称为ValidatingViewModelBase
。)您的每个视图都将使用从此类派生的视图模型。在每个视图模型中,一旦所有属性都有效,请将IsValid
设置为true。
接下来,像在任何MVVM应用程序中一样,为每个视图模型创建一个用户控件。如果设计的大小相同,UI会更有意义。
现在,创建一个视图模型,将这些视图模型的实例公开为属性(在我的示例中,它们被称为Page1
,Page2
等)并创建一个绑定到它的视图:
<Grid>
<Grid.Resources>
<Style x:Key="{x:Type ValidatingViewModelBase}">
<Setter Property="Visibility" Value="Visible"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsValid}" Value="True">
<Setter Property="Visibility" Value="Hidden"/>
</DataTrigger>
</Style>
<local:UserControl4 DataContext="{Binding Page4}"/>
<local:UserControl3 DataContext="{Binding Page3}"/>
<local:UserControl2 DataContext="{Binding Page2}"/>
<local:UserControl1 DataContext="{Binding Page1}"/>
</Grid>
(这假定已经设置了网格的DataContext
。)
这是如何工作的:Grid
在屏幕的同一空间中显示控件,从后到前排序。由于它们的大小相同,并且它们是不透明的,因此只显示最后一个。
在IsValid
视图中设置Page1
属性后,样式会将其Visibility
更改为Hidden
。现在第2页可见。这一直持续到所有四个页面都有效。由于我们将Visibility
设置为Hidden
而非Collapsed
,即使所有四个页面都不可见,Grid
仍保持相同的大小。
我没有测试过这个,所以我不知道你有多少时间会有焦点问题。当第1页变为不可见时,您可能希望第2页上的第一个控件获得键盘焦点。您可能需要查看Focus Overview中关于逻辑焦点的讨论,以了解如何处理此问题。