我有一个数据模板。它有两种视觉状态——展开、折叠。我添加了 2 个 GoToStateAction-s。第一个在数据上下文属性变为 True 时进入 Expanded 状态,第二个在同一属性变为 False 时进入 Collapsed 状态。
Checkbox 是模板的一部分并绑定到该属性。因此,当复选框被选中/取消选中时,就会发生必要的转换。
但是在启动时没有应用任何操作。复选框已选中,但未应用展开的视觉状态。
是否可以使用可视状态管理器来加载所有项目并根据属性值应用状态?
我有一个数据模板。它有两种视觉状态——展开、折叠。我添加了 2 个 GoToStateAction-s。第一个在数据上下文属性变为 True 时进入 Expanded 状态,第二个在同一属性变为 False 时进入 Collapsed 状态。
Checkbox 是模板的一部分并绑定到该属性。因此,当复选框被选中/取消选中时,就会发生必要的转换。
但是在启动时没有应用任何操作。复选框已选中,但未应用展开的视觉状态。
是否可以使用可视状态管理器来加载所有项目并根据属性值应用状态?
听起来您需要重写 OnApplyTemplate 并调用 VisualStateManager.GoToState()。发生的事情是您的控件被加载,数据绑定发生,然后模板被应用。因此模板处于基本状态,因为没有任何东西告诉它执行状态转换。您可能可以通过挂钩到加载的事件从 XAML 中完成所有操作,但您可能会发现它是不稳定的。
您只需要添加另一个在事件触发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
事件中触发它,如果选中该框,它将进入该状态,如果未选中,则不执行任何操作。
我有一个类似的问题,绑定的视觉状态不适用于视图加载:
<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"