我怎么能这样做,我的userControl在验证时消失了?

时间:2011-08-17 15:14:38

标签: c# wpf user-controls

我正在遵循这里的一些指示:

WPF Window Return Value

我在窗口中显示用户控件。用户控件包含多个控件,验证时(我的意思是,用户已输入所有数据)我需要显示另一个用户控件。

我正在使用类似边框的容器。

1 个答案:

答案 0 :(得分:1)

这是一种方法。我不知道这是最好的方式,但是我也不知道这种设计UI的方式是否一切都好。例如,如果我将有效数据放入其中时控制消失,如果我发现错误,如何将其恢复?巫师有一个“后退”按钮是有原因的。

首先,创建一个公开布尔IsValid属性的基本视图模型类。 (在我的示例中,我将其称为ValidatingViewModelBase。)您的每个视图都将使用从此类派生的视图模型。在每个视图模型中,一旦所有属性都有效,请将IsValid设置为true。

接下来,像在任何MVVM应用程序中一样,为每个视图模型创建一个用户控件。如果设计的大小相同,UI会更有意义。

现在,创建一个视图模型,将这些视图模型的实例公开为属性(在我的示例中,它们被称为Page1Page2等)并创建一个绑定到它的视图:

<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中关于逻辑焦点的讨论,以了解如何处理此问题。