我有一个DataTemplate。它有两种视觉状态 - Expanded,Collapsed。 我添加了2个GoToStateAction-s。当数据上下文属性变为True时,第一个进入Expanded状态,当相同属性变为False时,第二个进入Collapsed状态。
Checkbox是模板的一部分并绑定到该属性。因此,当选中/取消选中复选框时,会发生必要的转换。
但是在启动时都没有应用任何操作。复选框已选中,但未应用展开的可视状态。
是否可以使用Visual State Manager根据属性值包含所有已加载状态的项目?
答案 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”