使用MVVM模式实现UI状态机

时间:2013-02-06 13:21:27

标签: wpf mvvm state-machine

我正在使用wpf作为UI层的状态机程序,我使用了这个链接: http://elijahm.ninjuro.com/2012/01/04/visual-states-in-wpf-4-0/#comment-312通过调用VisualStateManager.GoToState(,,)更改活动窗口内容的文章。

但我不是一个好的wpf开发人员,我的问题是那篇文章的最后一部分,“从一个状态转换到另一个状态”部分,其中开发人员创建StateManager类并使用它来更改UI状态。 我不知道我的代码在哪里使用StateManager以及如何将业务状态更改传输到UI?

2 个答案:

答案 0 :(得分:6)

好问题。看起来该博客文章的作者确实假设您将知道在何处放置他显示的代码片段,部分基于类的名称和绑定的使用等。另外,如果您还没有,它将有助于阅读MVVM模式,以便他所引用的内容更有意义。

话虽如此,我将对博客文章的该部分进行简要说明。首先,“StateManager”类类似于this answer中的“StateHelper”类。这个答案也有更多的解释。

基本上,我们需要共同使用三个主要部分:ViewModel,View和自定义附加属性类(尤其是此附加属性的已更改回调方法)。

作者在名为“ViewState”的 ViewModel (类型为string)中创建了一个属性。这里的想法是,至少在他的方法中,ViewModel将知道何时应该改变视图状态(即,响应于数据的某个变化)。所以当那个时候到来时,他会使用常规的C#代码将ViewModel的“ViewState”属性更改为另一个州名(也许是“alertState”或其他东西) - 可能是这样的:

this.ViewState = "alertState";  

然后将这种情况联系在一起的事实是,查看只有binding(即“收听”对“状态更改”的“更改”)的方式 - 意味着视图通过监听ViewModel的“ViewState”属性的更改来执行状态更改(不是那么简单,但我会在一分钟内到达)。

StateManager.VisualStateProperty = "{Binding Path=ViewState}"

它能够执行实际VisualStateManager状态更改的方式是自定义“StateManager.VisualStateProperty”附加属性的已更改回调方法执行内置WPF方法VisualStateManager.GoToState(...) 。在他的帖子中,这是我所引用的改变回调:

new PropertyMetadata((dependencyObject, args) =>
{
    var frameworkElement = dependencyObject as FrameworkElement;
    if (frameworkElement == null)
        return;
    VisualStateManager.GoToState(frameworkElement, (string)args.NewValue, true);
}));

因此,当ViewModel更改其ViewState属性时,由于View具有对该属性的绑定,并且由于此自定义附加属性已分配了该绑定的结果,因此绑定引擎会更改其绑定的“结果”,这导致“StateManager.VisualStateProperty”的值发生变化,导致上面更改的回调方法被触发,这最终导致VisualStateManager.GoToState(..)方法执行实际的视觉状态更改。

答案 1 :(得分:1)

该文章适用于MVVM模式,它将逻辑代码与视图分开,因此需要额外的代码将视图状态更改从ViewModel重定向到View。如果您没有使用MVVM,那么您可以使用VisualStateManager.GoToState在代码隐藏中的任何位置进行状态更改:

VisualStateManager.GoToState(this, "MyNextState", true);