2

私は XBAP を開発していますが、簡単な要件があります。

DataContextメイン ページ全体の は、 my のインスタンスに設定されますUserViewModelUserViewModelには、「 」、「 」、「」などの値を持つ列挙型である がDependencyProperty呼び出されます。 AuthenticationStateAuthenticatedNotAutheticatedAuthenticationFailed

ここで、ページ上のさまざまな要素を非表示/表示して、この値の変更に対応する必要があります。

それを行うための最良の方法は何ですか(そしてどこですか?)

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

望ましい方法は、コントロールの Visibility プロパティをデータ コンテキストの AuthenticationState プロパティにバインドする際に使用される "AuthenticationStateToVisibilityConverter" と呼ばれるコンバーターを使用することです。

于 2009-03-20T16:36:02.563 に答える
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 に答える
0

実際、これを行う最善の方法は、ビュー モデルから適切なプロパティを公開することです。これにより、ロジックがより集中化され、テストが容易になります。また、コンバーターよりも優れたパフォーマンスを発揮します。結局のところ、それはビューモデルです。したがって、ビューをモデル化する必要があります。パネルをいつ非表示/表示するかを伝えるプロパティがビューに必要な場合は、そのようなプロパティをビュー モデルに追加します。

于 2009-03-20T16:54:37.667 に答える
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 に答える