2

我正在开发一个 XBAP,我有一个简单的要求。

整个DataContext主页的 设置为 my 的一个实例UserViewModelUserViewModel有一个DependencyProperty被调用的AuthenticationState对象,它是一个枚举值,例如 ' Authenticated'、' NotAutheticated' 和 ' AuthenticationFailed'。

现在,我需要通过隐藏/显示页面上的各种元素来响应此值的任何变化。

最好的方法是什么(以及在哪里)?

4

5 回答 5

3

正如您所提到的,您不能直接在控件上使用 DataTrigger。一种解决方法是在每个需要隐藏的控件上使用一种样式。

<Grid>
    <Rectangle Fill="Red" />
    <Grid.Style>
        <Style TargetType="Grid">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Test}" Value="true">
                    <Setter Property="Visibility" Value="Collapsed" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Grid.Style>
</Grid>
于 2009-03-20T16:33:19.467 回答
2

一种更可取的方法是使用名为“AuthenticationStateToVisibilityConverter”的转换器,该转换器用于将控件的 Visibility 属性绑定到数据上下文的 AuthenticationState 属性。

于 2009-03-20T16:36:02.563 回答
0

最好的方法是使用 DataTrigger。所以是这样的:

<Window.Triggers>
    <DataTrigger Binding="{Binding AuthenticationState}" Value="NotAuthenticated">
        <Setter TargetName="nameOfControl" Property="Visibility" Value="Collapsed" />
    </DataTrigger>
    ...
    <TextBox x:Name="nameOfControl" />
</Window.Triggers>

只要您的 UserViewModel 对象位于 Window 的 DataContext 中,那么这应该可以工作!

于 2009-03-20T16:19:16.020 回答
0

实际上,最好的方法是从视图模型中公开适当的属性。这使您的逻辑更加集中并且更容易测试。此外,它的性能优于转换器。毕竟,它是一个视图模型。因此,它应该对视图进行建模。如果视图需要一个属性来告诉它何时隐藏/显示面板,请将这样的属性添加到您的视图模型中。

于 2009-03-20T16:54:37.667 回答
0

设法使用样式对其进行排序。这很痛苦,但它有效!

完整来源如下。

<Grid x:Name="contentGrid" Grid.Row="1">
        <!--login-->
        <controls:LoginControl>
            <controls:LoginControl.Style>
                <Style>
                    <Setter Property="Control.Opacity" Value="0"/>
                    <Setter Property="Control.IsHitTestVisible" Value="False"/>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Source={StaticResource UserViewModel},Path=UserAuthenticationState}"
                                     Value="{x:Static model:AuthenticationState.NotAuthenticated}">
                            <Setter Property="Control.IsHitTestVisible" Value="True"/>
                            <DataTrigger.EnterActions>
                                <BeginStoryboard>
                                    <Storyboard>
                                        <DoubleAnimation To="1" Duration="0:0:2"
                                                         Storyboard.TargetProperty="Opacity"></DoubleAnimation>
                                    </Storyboard>
                                </BeginStoryboard>
                            </DataTrigger.EnterActions>
                            <DataTrigger.ExitActions>
                                <BeginStoryboard>
                                    <Storyboard>
                                        <DoubleAnimation To="0" Duration="0:0:2"
                                                         Storyboard.TargetProperty="Opacity"></DoubleAnimation>
                                    </Storyboard>
                                </BeginStoryboard>
                            </DataTrigger.ExitActions>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </controls:LoginControl.Style>
        </controls:LoginControl>    

        <!--slider-->
        <slider:PageSlider>
            <Button>1</Button>
            <Button>2</Button>
            <Button>3</Button>
            <slider:PageSlider.Style>
                <Style>
                    <Setter Property="Control.Opacity" Value="0"/>
                    <Setter Property="Control.IsHitTestVisible" Value="False"/>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Source={StaticResource UserViewModel},Path=UserAuthenticationState}"
                                     Value="{x:Static model:AuthenticationState.Authenticated}">
                            <Setter Property="Control.IsHitTestVisible" Value="True"/>
                            <DataTrigger.EnterActions>
                                <BeginStoryboard>
                                    <Storyboard>
                                        <DoubleAnimation To="1" Duration="0:0:2"
                                                         Storyboard.TargetProperty="Opacity"></DoubleAnimation>
                                    </Storyboard>
                                </BeginStoryboard>
                            </DataTrigger.EnterActions>
                            <DataTrigger.ExitActions>
                                <BeginStoryboard>
                                    <Storyboard>
                                        <DoubleAnimation To="0" Duration="0:0:2"
                                                         Storyboard.TargetProperty="Opacity"></DoubleAnimation>
                                    </Storyboard>
                                </BeginStoryboard>
                            </DataTrigger.ExitActions>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </slider:PageSlider.Style>
        </slider:PageSlider>
    </Grid>
于 2009-03-20T17:15:28.180 回答