Wpf 使用MVVM模式实现UI状态机

Wpf 使用MVVM模式实现UI状态机,wpf,mvvm,state-machine,Wpf,Mvvm,State Machine,我正在使用wpf作为UI层的状态机程序上工作,我使用了以下链接: 文章通过调用VisualStateManager.gostate(,)更改活动窗口的内容 但我不是一个好的wpf开发人员,我的问题是这篇文章的最后一节,“从一种状态更改为另一种状态”,在这一节中,开发人员创建StateManager类并使用它更改UI状态。 我不知道在我的代码中我在哪里使用StateManager,以及如何将业务状态更改传输到UI?好问题。看起来,这篇博客文章的作者确实假设您知道将他展示的代码放在哪里,部分基于类的

我正在使用wpf作为UI层的状态机程序上工作,我使用了以下链接: 文章通过调用VisualStateManager.gostate(,)更改活动窗口的内容

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

好问题。看起来,这篇博客文章的作者确实假设您知道将他展示的代码放在哪里,部分基于类的名称和绑定的使用等。此外,如果您还没有,那么阅读MVVM模式将有助于更好地理解他引用的内容

话虽如此,我将对这篇博文的这一部分做一个简要的解释。首先,“StateManager”类类似于中的“StateHelper”类。这个答案还有更多的解释

本质上,我们有三个主要部分需要一起工作:ViewModel、View和一个自定义的附加属性类(特别是这个附加属性的已更改回调方法)

作者在他的视图模型(类型为
字符串
)中创建了一个名为“ViewState”的属性。这里的想法是,至少在他的方法中,ViewModel将知道何时应该更改视图状态(即,对数据中的特定更改作出反应)。因此,到时候,他将使用常规C#代码将ViewModel的“ViewState”属性更改为另一个状态名称(可能是“alertState”或其他名称),可能类似于:

this.ViewState = "alertState";  
然后将其联系在一起的事实是,视图有一种方式将绑定到那些“状态更改”(即“侦听更改”)中,这意味着视图通过侦听对ViewModel的“ViewState”属性的更改来执行状态更改(没那么简单,但我马上就到)

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

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

因此,当ViewModel更改其ViewState属性时,由于视图具有与该属性的绑定,并且由于此自定义附加属性已被分配该绑定的结果,绑定引擎将更改其绑定的“结果”,从而导致“StateManager.VisualStateProperty”的值要更改,将触发上述更改的回调方法,这(最终)将导致
VisualStateManager.GoToState(…)
方法来执行实际的可视状态更改。

这是一个好问题。这篇博文的作者似乎确实假设您知道如何放置他显示的代码片段,部分基于类的名称和绑定的使用等。此外,如果您还没有,这将有助于了解MVVM模式,以便他提到的东西会更有意义

话虽如此,我将对这篇博文的这一部分做一个简要的解释。首先,“StateManager”类类似于中的“StateHelper”类。这个答案还有更多的解释

本质上,我们有三个主要部分需要一起工作:ViewModel、View和一个自定义的附加属性类(特别是这个附加属性的已更改回调方法)

作者在他的ViewModel(类型为
string
)中创建了一个名为“ViewState”的属性。这里的想法是,至少在他的方法中,ViewModel将知道何时应该更改视图状态(即,对数据中的特定更改作出反应)。因此,当该时间到来时,他将更改ViewModel的“ViewState”属性转换为另一个状态名称(可能是“alertState”或其他名称),使用常规C#代码-可能类似于:

this.ViewState = "alertState";  
然后将其联系在一起的事实是,视图有一种方式将绑定到那些“状态更改”(即“侦听更改”)中,这意味着视图通过侦听对ViewModel的“ViewState”属性的更改来执行状态更改(没那么简单,但我马上就到)

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

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

因此,当ViewModel更改其ViewState属性时,由于视图具有与该属性的绑定,并且由于此自定义附加属性已被分配该绑定的结果,绑定引擎将更改其绑定的“结果”,从而导致“StateManager.VisualStateProperty”的值要更改,将触发上述更改的回调方法,这(最终)将导致
VisualStateManager.GoToState(…)
方法来执行实际的可视状态更改。

这篇文章适用于MVVM模式,它将逻辑代码与视图分离,因此需要额外的代码来将可视状态更改从ViewModel重定向到视图。如果不使用MVVM,则可以使用在代码后面的任何位置执行状态更改e> VisualStateManager.gostate:

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

这篇文章适用于MVVM模式,它将逻辑代码与视图分离,因此需要额外的代码将可视状态更改从ViewModel重定向到视图