Xaml 根据视图模型中的属性跳过状态

Xaml 根据视图模型中的属性跳过状态,xaml,mvvm,windows-phone-8.1,windows-8.1,mvvm-light,Xaml,Mvvm,Windows Phone 8.1,Windows 8.1,Mvvm Light,我是MVVM的新手,所以我认为这是最基本的。这是一个Windows8.1应用程序,带有MVVM灯和Sqlite数据库 我有一个包含4个状态的页面。每个状态都包含一个GridView,您可以在其中选择要设置绑定属性的项。在选择更改后,我进入下一个状态 以下是GridView的xaml: <GridView Grid.Row="1" Grid.Column="1" ItemsSource="{Binding Essences}" SelectedItem="{Binding Selected

我是MVVM的新手,所以我认为这是最基本的。这是一个Windows8.1应用程序,带有MVVM灯和Sqlite数据库

我有一个包含4个状态的页面。每个状态都包含一个GridView,您可以在其中选择要设置绑定属性的项。在选择更改后,我进入下一个状态

以下是GridView的xaml:

 <GridView Grid.Row="1" Grid.Column="1" ItemsSource="{Binding Essences}" SelectedItem="{Binding SelectedEssense,Mode=TwoWay}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" x:Name="EssenceGridView" Opacity="0" >
        <Interactivity:Interaction.Behaviors>
            <Core:EventTriggerBehavior EventName="SelectionChanged">
                <Core:GoToStateAction StateName="Diametre"/>
            </Core:EventTriggerBehavior>
        </Interactivity:Interaction.Behaviors>
        <GridView.ItemTemplate>
            <DataTemplate >
                <Grid Width="250" Height="80">
                    <TextBlock Text="{Binding Trigramme}" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
                </Grid>
            </DataTemplate>
        </GridView.ItemTemplate>
    </GridView>

现在它开始工作了,谢谢很多人

“跳过一个州”是什么意思?每个状态组只能有一个活动状态,并且它们没有特定的顺序。您可以从任何状态更改为任何状态。每个状态对应于一个GridView,当在一个GridView中完成选择时,我将使用另一个GridView激活下一个状态,以便用户可以选择项目。状态一个接一个地处于活动状态,正如您在GridView的xaml中看到的,我在SelectionChanged事件上更改了当前状态。让我们假设状态“Diametre”是第二个状态(按我的顺序)。如果默认情况下设置了我的属性“Diametre”(这是我的应用程序中的一个选项),我希望UI“跳过”此状态,并直接转到第三个状态。我猜您可以通过viewmodel上的命令重新路由selectionchanged事件。这样,您就可以传递一个命令param(所选值),并在viewmodel的命令代码中检查它。根据您的标准,您可以从viewmodelThx Depechie启动正确的故事板,是否可以从我的ViewModel中选择要设置为活动的状态?找不到如何将VisualState对象绑定到我的当前状态,然后如何更改它VisualStateManager.GoToState(..)方法需要一个UI.xaml.control参数,如何在MVVM中实现这一点?
class BindVisualStateBehaviorHandler : Behavior<FrameworkElement>
{
    //
    // Dependency property "StateName" that you can bind in Blend.
    // Bind this to the enumeration that controls the visual state.
    //
    public static DependencyProperty StateNameProperty = DependencyProperty.Register(
        "StateName",
        typeof(string),
        typeof(BindVisualStateBehaviorHandler),
        new PropertyMetadata(null, StateNamePropertyChanged));

    public string StateName
    {
        get { return (string)GetValue(StateNameProperty); }
        set { SetValue(StateNameProperty, value); }
    }

    //
    // When the StateName property changes, switch to the
    // new visual state, and play transition animations.
    //
    private static void StateNamePropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
    {
        ((BindVisualStateBehaviorHandler)obj).UpdateVisualState(
            (string)args.NewValue,
            useTransitions: true);
    }

    //
    // When the behavior is first attached, go to the visual state,
    // but don't play any animations.
    //
    protected override void OnAttached()
    {
        UpdateVisualState(
            StateName,
            useTransitions: false);
        base.OnAttached();
    }

    private void UpdateVisualState(string visualState, bool useTransitions)
    {
        if (AssociatedObject != null)
        {
            if (VisualStateUtilities.FindNearestStatefulControl(base.AssociatedObject as FrameworkElement) != null)
            {
                VisualStateUtilities.GoToState(
                    VisualStateUtilities.FindNearestStatefulControl(base.AssociatedObject as FrameworkElement),
                    visualState,
                    useTransitions);
            }
        }
    }
}
 public abstract class Behavior<T> : DependencyObject, IBehavior where T : DependencyObject
{
    //http://reflectionit.nl/Blog/2013/windows-8-xaml-tips-creating-blend-behaviors

    [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
    public T AssociatedObject { get; set; }

    protected virtual void OnAttached()
    {
    }

    protected virtual void OnDetaching()
    {
    }

    public void Attach(Windows.UI.Xaml.DependencyObject associatedObject)
    {
        this.AssociatedObject = (T)associatedObject;
        OnAttached();
    }

    public void Detach()
    {
        OnDetaching();
    }

    DependencyObject IBehavior.AssociatedObject
    {
        get { return this.AssociatedObject; }
    }
}
 <VisualStateManager.VisualStateGroups>
        <VisualStateGroup x:Name="AppStates" >
            <VisualStateGroup.Transitions>
                <VisualTransition GeneratedDuration="0:0:0.2"/>
            </VisualStateGroup.Transitions>
            <VisualState x:Name="SaisieTige" >
                ...
            <VisualState x:Name="Diametre">
                ...
            </VisualState>
            <VisualState x:Name="Hauteur">
               ...
            </VisualState>
            <VisualState x:Name="Resume">
                ...
            </VisualState>
        </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>
    <Interactivity:Interaction.Behaviors>
        <Behavior:BindVisualStateBehaviorHandler x:Name="AppStateBehavior" StateName="{Binding StateHandler.AppState,Mode=TwoWay}"></Behavior:BindVisualStateBehaviorHandler>
        <Core:EventTriggerBehavior EventName="Loaded">
            <Core:InvokeCommandAction Command="{Binding SelectEssenceOrNotCommand}"></Core:InvokeCommandAction>
        </Core:EventTriggerBehavior>
    </Interactivity:Interaction.Behaviors>
 StateHandler.SetAppState(AppStates.SaisieTige);
 RaisePropertyChanged("StateHandler");