VisualStateManager.GoToState不适用于DataTemplate

时间:2012-07-21 14:14:19

标签: c# xaml blend visualstatemanager visualstates

我有一个列表框,其中DataTemplate设置为ItemTemplate,我想使用Codebehind更改VisualState

的DataTemplate:

<DataTemplate x:Key="SortedRecommendationTemplate">
    <Border x:Name="asds">
        <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="VisualStateGroup">
                <VisualState x:Name="OnlyNameState">
                    <Storyboard>
                        ...
                    </Storyboard>
                </VisualState>
                <VisualState x:Name="OnlyImageState"/>
                <VisualState x:Name="AllInfoState">
                    <Storyboard>
                        ...
                    </Storyboard>
                </VisualState>
            </VisualStateGroup>
        </VisualStateManager.VisualStateGroups>
        <Grid>
            ...
        </Grid
    </Border>
</DataTemplate>

这是我用来获取Border的代码(FindChild来自How to find element in visual tree? wp7)并更改VisualState

var blub = FindChild<Border>(listBox, "asds");
VisualStateManager.GoToState(blub, "AllInfoState", true);

但是,GoToStates返回false。而blub真的是我想要的边界(这是第一个Listboxitem) 但VisualStates似乎有效,因为当我使用Blend中的Behaviors时,它们实际上会改变:

触发器:

<i:Interaction.Triggers>
    <i:EventTrigger EventName="MouseEnter">
        <ei:GoToStateAction StateName="AllInfoState" TargetObject="{Binding ElementName=asds}"/>
    </i:EventTrigger>
    <i:EventTrigger EventName="MouseLeave">
        <ei:GoToStateAction StateName="OnlyNameState" TargetObject="{Binding ElementName=asds}"/>
    </i:EventTrigger>

有人知道发生了什么吗?提前谢谢!

1 个答案:

答案 0 :(得分:4)

这是因为Border不是Control,而是FrameworkElementVisualStateManager.GoToState(Control control, string stateName, bool useTransitions)但只适用于Control

您可以使用Microsoft.Expression.Interactivity.Core中的ExtendedVisualStateManager.GoToElementState(FrameworkElement root, string stateName, bool useTransitions)。我想这就是Blend在内部使用的。