Wpf 如何在加载元素时使用DataTrigger运行特定的GoToStateTAction

Wpf 如何在加载元素时使用DataTrigger运行特定的GoToStateTAction,wpf,expression-blend,visualstatemanager,Wpf,Expression Blend,Visualstatemanager,我有一个数据模板。它有两种可视状态-展开、折叠。 我添加了2个GoToStateAction-s。当数据上下文属性变为True时,第一个变为展开状态,当同一属性变为False时,第二个变为折叠状态 复选框是模板的一部分,并绑定到该属性。因此,当复选框被选中/取消选中时,将发生必要的转换 但这些操作都不会在启动时应用。复选框已选中,但未应用展开的视觉状态 是否可以使用可视化状态管理器根据属性值加载所有项目,并应用状态?您只需添加另一个GoToStateAction,在OnLoad事件触发时设置所需

我有一个数据模板。它有两种可视状态-展开、折叠。 我添加了2个GoToStateAction-s。当数据上下文属性变为True时,第一个变为展开状态,当同一属性变为False时,第二个变为折叠状态

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

但这些操作都不会在启动时应用。复选框已选中,但未应用展开的视觉状态


是否可以使用可视化状态管理器根据属性值加载所有项目,并应用状态?

您只需添加另一个
GoToStateAction
,在
OnLoad
事件触发时设置所需状态

更新 我还没有对此进行测试,但我认为您可以使用一个自定义的
targetedtriggeration
,它派生自
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);
    }
}
当附加到
切换按钮
时,如
复选框
,此操作仅在
IsChecked==true
时执行


您可以从
OnLoad
事件触发此操作,如果选中此框,它将进入状态,如果未选中,它将不执行任何操作。

听起来您需要覆盖OnApplyTemplate并调用VisualStateManager.goState()。发生的事情是加载了控件,进行了数据绑定,然后应用了模板。因此,模板处于基本状态,因为没有任何命令它执行状态转换。通过挂接到加载的事件,您可能可以从XAML完成这一切,但您可能会发现它很脆弱。

我有一个类似的问题,即绑定的可视状态没有应用于视图加载:

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

由于我使用的是MVVM体系结构,因此无法覆盖视图的OnApplyTemplate,因为视图无法“看到”ViewModel

最后,我发现这很有帮助,我想与大家分享:

<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“

问题是,我无法判断在OnLoad时需要设置什么状态。它取决于数据上下文属性的值。还是我遗漏了一些明显的东西?@arconaut不,我不认为你遗漏了一些明显的东西。问题在于,这种行为只能由事件触发。因此,复选框在启动时并不总是处于相同的状态?不,它不是。它绑定到数据,并且该数据项可能具有不同值的属性。我也遇到了这个问题,您是否找到了解决方案?对于子孙后代,建议在删除的答案中使用以下内容:阅读帖子很有趣,找到类似“视图无法在MVVM中看到ViewModel”这样的误导性语句。然后尝试在你的情况下同样有效的建议!然后想放弃投票,会发现这是你6个月前的帖子:D#madness#