如何在加载元素时运行特定的GoToStateAction-with-DataTrigger

时间:2010-08-06 11:57:33

标签: wpf expression-blend visualstatemanager

我有一个DataTemplate。它有两种视觉状态 - Expanded,Collapsed。 我添加了2个GoToStateAction-s。当数据上下文属性变为True时,第一个进入Expanded状态,当相同属性变为False时,第二个进入Collapsed状态。

Checkbox是模板的一部分并绑定到该属性。因此,当选中/取消选中复选框时,会发生必要的转换。

但是在启动时都没有应用任何操作。复选框已选中,但未应用展开的可视状态。

是否可以使用Visual State Manager根据属性值包含所有已加载状态的项目?

3 个答案:

答案 0 :(得分:2)

听起来你需要覆盖OnApplyTemplate并调用VisualStateManager.GoToState()。发生了什么是加载了您的控件,发生了数据绑定,然后应用了模板。因此模板处于基本状态,因为没有告诉它执行状态转换。您可以通过挂接到已加载的事件从XAML完成所有操作,但您可能会发现它是片状的。

答案 1 :(得分: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事件触发此事件,如果选中此框,它将进入状态,或者如果未选中则不执行任何操作。

答案 2 :(得分:0)

我遇到类似的问题,即在视图加载时未应用绑定的可视状态:

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

当我使用MVVM架构时,我无法覆盖视图的OnApplyTemplate,因为视图无法“看到”ViewModel。

最后,我发现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>

其中xmlns:interactivity =“http://schemas.microsoft.com/expression/2010/interactivity”