如何进一步将此WPF示例与MVC,MVP或MVVM分离?

Edw*_*uay 2 wpf mvp events mvvm decoupling

我已经通过以下方式解耦了这个WPF应用程序中的事件.

继续脱钩的最佳方法是什么?

Shell.xaml:

<Button x:Name="btnProcess"
        Content="Process"
        Margin="10"/>
Run Code Online (Sandbox Code Playgroud)

Bootstrapper.cs:

public void Run()
{
    Shell shell = new Shell(new Customer());
    shell.Show();
}
Run Code Online (Sandbox Code Playgroud)

Shell.xaml.cs:

public Shell(IPerson person)
{
    InitializeComponent();
    btnProcess.Click +=new RoutedEventHandler(person.Process);
}
Run Code Online (Sandbox Code Playgroud)

Customer.cs:

public class Customer : IPerson
{
    public void Process(object sender, RoutedEventArgs e)
    {
        Button theButton = (Button)sender;
        theButton.Content = "Customer processed.";
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码成功地将视图Shell与模型分离,Customer:IPerson以便我可以交换例如以Employee:IPerson自己的方式处理"已处理" 的模型等.这是第一个目标.

但现在:

  • 我如何将该Processed方法与特定于Button 的方式分离,以便它还可以与一个MenuItem或一个ListView进行对话,该ViewView在视图中触发事件,因此它甚至不必是一个调用它的元素,例如单元测试类?
  • 除了发送者(按钮)之外,如何更改视图的其他元素,例如,如何更改Shell中的状态栏?我看到两种方式:
    • 我可以构建一个容纳所有视图的容器,并在创建时将容器注入Customer中,然后客户可以查看容器并操纵它想要的调用视图(尽管我必须以某种方式匹配发送事件的视图)和容器中的视图一样)
    • 我可以以某种方式在触发事件时使用eventargs将整个视图(Window对象)发送到Model,尽管Model需要某种方式知道(通过接口)在运行时可以操作的区域类型
  • 您将如何在更加分离的设计方向上继续使用此应用程序?
  • 实际上是什么模式,例如MVC,MVP,MVVM?我只看到一个视图(Shell)和一个Model(Customer).
    • 演示者如何适应?
    • ViewModel如何适应?
    • 控制器如何适应?

Che*_*rot 5

我建议您使用命令而不是经典事件来实现事件处理.它在WPF中很容易,因为命令模式已经实现,你可以告诉你所有的UI输入(按钮,菜单项......)他们的命令是[你的命令的名字]并在一个地方处理所有这些.