3

私は DataTemplate を持っています。Expanded、Collapsed という 2 つの表示状態があります。GoToStateAction を 2 つ追加しました。1 つ目は、データ コンテキスト プロパティが True になると Expanded 状態になり、2 つ目は同じプロパティが False になると Collapsed 状態になります。

チェックボックスはテンプレートの一部であり、そのプロパティにバインドされています。したがって、チェックボックスがチェック/チェック解除されると、必要な遷移が発生します。

ただし、起動時に適用されるアクションはありません。チェックボックスはチェックされていますが、展開表示状態は適用されていません。

Visual State Manager を使用して、プロパティ値に従って適用された状態ですべてのアイテムをロードすることは可能ですか?

4

3 に答える 3

2

OnApplyTemplate をオーバーライドして VisualStateManager.GoToState() を呼び出す必要があるようです。コントロールが読み込まれ、データ バインディングが発生し、テンプレートが適用されました。したがって、状態遷移を実行するように何も指示されていないため、テンプレートは基本状態にあります。ロードされたイベントにフックすることで XAML からすべてを実行できる場合がありますが、不安定であることがわかる場合があります。

于 2012-06-21T21:49:35.403 に答える
0

イベントの発生GoToStateAction時に目的の状態を設定する別のものを追加するだけです。OnLoad

アップデート

TargetedTriggerAction私はこれをテストしていませんが、から派生したカスタムを使用できると思いますGoToStateAction:

public class GoToStateIfCheckedAction : GoToStateAction
{
    protected override void Invoke(object parameter)
    {
        var toggleButton = Target as ToggleButton;
        if (toggleButton != null && (!toggleButton.IsChecked.HasValue || !toggleButton.IsChecked.Value))
        {
            // if the Target is a ToggleButton, and it is in an indeterminate or unchecked state, don't invoke
            return;
        }

        // if the Target is not a ToggleButton, or if the ToggleButton is checked, go ahead and invoke the action
        base.Invoke(parameter);
    }
}

ToggleButtonなどの にアタッチされている場合CheckBox、このアクションは の場合にのみ実行されIsChecked == trueます。

イベントからこれをトリガーすることができOnLoad、ボックスがチェックされている場合は状態になり、チェックされていない場合は何もしません。

于 2010-08-06T14:15:01.350 に答える
0

ビューの読み込み時にバインドされた視覚状態が適用されないという同様の問題があります。

<core:PropertyChangedTrigger Binding="{Binding State}">
    <core:GoToStateAction StateName="{Binding State}" />
</core:PropertyChangedTrigger>

私はMVVMアーキテクチャを使用しているため、ビューはViewModelを「見る」ことができないため、ビューのOnApplyTemplateをオーバーライドできません。

最後に、EventTriggerが役立つことがわかりました。それをあなたと共有したいと思います。

<interactivity:Interaction.Triggers>
    <interactivity:EventTrigger>
        <core:GoToStateAction StateName="{Binding State}" />
    </interactivity:EventTrigger>
    <core:PropertyChangedTrigger Binding="{Binding State}">
        <core:GoToStateAction StateName="{Binding State}" />
    </core:PropertyChangedTrigger>
</interactivity:Interaction.Triggers>

where xmlns:interactivity="http://schemas.microsoft.com/expression/2010/interactivity"

于 2016-06-09T13:49:43.470 に答える