出于多种原因,我不会在 ViewModel 中使用 VisualStateManager.GoToState,最大的原因是您必须传入要更改其视觉状态的控件。将 UI 控件传递给您的视图模型与整个 MVVM 方法背道而驰。
我的建议是使用(对于 Windows 8 商店)Winrt 行为或使用 Blend system.windows.interactivity.dll(对于相同的功能)从视图模型中获取 VisualState 名称并更新对象。代码看起来像这样:
视图模型:
public string State{
get{_stateName;}
set{_stateName=value;
RaisePropertyChanged("State");
}
看法:
<Grid>
<I:Interaction.Behaviors>
<b:VisualStateSettingBehavior StateToSet="{Binding State}"/>
</i:Interaction.Behaviors>
</Grid>
行为:
public class VisualStateSettingBehavior:Behavior<Control>
{
StateToSet{
get{GetValue(StateProperty) as string;}
set{SetValue{StateProperty,value);
LoadState();}
}
private void LoadState()
{
VisualStateManager.GoToState(AssociatedObject,StateToSet,true);
}
}
该行为所做的是连接到控件并允许您以编程方式扩展其功能。这种方法允许您将 ViewModel 与您的 View 分开。