如何通过ViewModel更改VisualState

我知道这个问题类似于很多。 无论如何,我不明白。

我有几个VisualStates (超过2个,这就是为什么DataStateBehavior不是我的解决方案)。 我有ViewModel,它具有枚举属性CurrentState 。 每个枚举值代表一个状态,也可能是几个枚举值代表一个状态,不符合。 我希望当CurrentState改变时改变了VisualState (想到,我脑子里立刻出现了: Binding是为这种情况准确创建的!

我可以将CurrentState与视图VisualState (仅限xaml解决方案)绑定,以获得上述行为吗?

如果是,我该怎么办?

如果不是,我应该如何在我的ViewModel中使用VisualStateManager.GoToState()方法?

我不会在ViewModel中使用VisualStateManager.GoToState有很多原因,最重要的是你必须传递你将要改变它的视觉状态的控件。 将UI控件传递给viewmodel违背了整个MVVM方法。

我的建议是使用(对于Windows 8商店) Winrt Behaviors或使用Blend system.windows.interactivity.dll(用于相同的function)从视图模型中获取VisualState名称并更新对象。 代码看起来像这样:

视图模型:

public string State{ get{_stateName;} set{_stateName=value; RaisePropertyChanged("State"); } 

视图:

      

行为:

 public class VisualStateSettingBehavior:Behavior { StateToSet{ get{GetValue(StateProperty) as string;} set{SetValue{StateProperty,value); LoadState();} } private void LoadState() { VisualStateManager.GoToState(AssociatedObject,StateToSet,true); } } 

行为的作用是连接到控件并允许您以编程方式扩展其function。 此方法允许您将ViewModel与View分开。

我想要注意一个类似于@FasterSolutions的解决方案,使用Blend SDK的内置组件。

在视图模型的“CurrentState”属性上设置PropertyChangedTrigger ,并添加GoToStateAction以更改视觉状态: