Xaml 根据视图模型中的属性跳过状态
我是MVVM的新手,所以我认为这是最基本的。这是一个Windows8.1应用程序,带有MVVM灯和Sqlite数据库 我有一个包含4个状态的页面。每个状态都包含一个GridView,您可以在其中选择要设置绑定属性的项。在选择更改后,我进入下一个状态 以下是GridView的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
<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");