如何通过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
以更改视觉状态: