如何进一步将这个WPF示例与MVC、MVP或MVVM解耦?

如何进一步将这个WPF示例与MVC、MVP或MVVM解耦?,wpf,events,mvvm,mvp,decoupling,Wpf,Events,Mvvm,Mvp,Decoupling,我已通过以下方式将此WPF应用程序中的事件解耦 继续脱钩的最佳方式是什么 Shell.xaml: <Button x:Name="btnProcess" Content="Process" Margin="10"/> public void Run() { Shell shell = new Shell(new Customer()); shell.Show(); } public Shell(IPerson person) {

我已通过以下方式将此WPF应用程序中的事件解耦

继续脱钩的最佳方式是什么

Shell.xaml:

<Button x:Name="btnProcess"
        Content="Process"
        Margin="10"/>
public void Run()
{
    Shell shell = new Shell(new Customer());
    shell.Show();
}
public Shell(IPerson person)
{
    InitializeComponent();
    btnProcess.Click +=new RoutedEventHandler(person.Process);
}
public class Customer : IPerson
{
    public void Process(object sender, RoutedEventArgs e)
    {
        Button theButton = (Button)sender;
        theButton.Content = "Customer processed.";
    }
}
Shell.xaml.cs:

<Button x:Name="btnProcess"
        Content="Process"
        Margin="10"/>
public void Run()
{
    Shell shell = new Shell(new Customer());
    shell.Show();
}
public Shell(IPerson person)
{
    InitializeComponent();
    btnProcess.Click +=new RoutedEventHandler(person.Process);
}
public class Customer : IPerson
{
    public void Process(object sender, RoutedEventArgs e)
    {
        Button theButton = (Button)sender;
        theButton.Content = "Customer processed.";
    }
}
Customer.cs:

<Button x:Name="btnProcess"
        Content="Process"
        Margin="10"/>
public void Run()
{
    Shell shell = new Shell(new Customer());
    shell.Show();
}
public Shell(IPerson person)
{
    InitializeComponent();
    btnProcess.Click +=new RoutedEventHandler(person.Process);
}
public class Customer : IPerson
{
    public void Process(object sender, RoutedEventArgs e)
    {
        Button theButton = (Button)sender;
        theButton.Content = "Customer processed.";
    }
}
上面的代码成功地将视图
Shell
与模型
Customer:IPerson
分离,这样我就可以插入一个模型
Employee:IPerson
等,它以自己的方式处理“已处理”。这是第一个进球

但现在:

  • 如何将
    已处理的
    方法与特定于按钮的对话分离,以便它也可以与在视图中触发事件的菜单项或列表视图对话,甚至不必是调用它的元素,例如单元测试类
  • 如何更改视图中除发件人(按钮)之外的其他元素,例如,如何更改Shell中的状态栏?我认为有两种方式:
    • 我可以构建一个包含所有视图的容器,并在创建时将容器注入客户,然后客户可以在容器中查看并以任何方式操纵调用视图(尽管我必须以某种方式将发送事件的视图与容器中的视图匹配为同一视图)
    • 在触发事件时,我可以通过某种方式将整个视图(窗口对象)发送到带有eventargs的模型,尽管模型需要某种方式(通过接口)知道在运行时可以操作哪些类型的区域
  • 您将如何继续朝着更加解耦的设计方向发展此应用程序
  • 这实际上是什么模式,例如MVC、MVP、MVVM?我只看到一个视图(外壳)和一个模型(客户)。
    • 演讲者如何适应
    • ViewModel将如何适应
    • 控制器将如何适应

我建议您使用命令而不是经典事件来实现事件处理。
在WPF中非常简单,因为命令模式已经实现,您可以告诉所有UI输入(按钮、菜单项…)它们的命令是[您的命令名称],并在一个位置处理所有这些命令。

正如Chen所建议的,我将研究命令模式:


在Jaime Rodriquez的博客上可以找到一个我学到很多东西的工作示例:

我如何将处理后的方法与特定于按钮的对话分离开来
命令。在IPerson接口中放置一个命令,并从Shell的xaml调用该命令

如何更改视图的其他元素
属性和绑定。如果有一个属性显示状态(已处理/未处理),那么可以使用绑定直接在xaml中显示该属性

您将如何继续
我会在Shell和IPerson之间创建一个ViewModel,从而更深入地了解MVVM路径。ViewModel被设计为具有1)绑定所需的属性,以及2)任何需要执行的命令。ViewModel旨在为UI提供模型所需的内容

这是什么图案
目前?没有什么。我只看到两个对象,视图和模型。您没有演示者、控制器或视图模型


对于WPF,我更喜欢ViewModel。有关MVVM的更多信息,请参见问题。

卡梅隆·麦克法兰在这里做得很好,但我可以补充一点

当遵循M-V-VM时,您可以使用数据绑定、命令、附加行为和接口来实现解耦。数据绑定应该是不言而喻的。您已经对命令进行了很好的描述,但我建议您避免使用RoutedCommand,并坚持使用ICommand实现。附加的行为是附加的DependencyProperty,它们订阅它们所附加到的元素上的事件,在此场景中,将用于将事件处理中继到ViewModel。接口为您提供了最大的灵活性,但您必须确定如何将接口传递给ViewModel。现在了解所有这些的最好方法是使用Google并查看现有的M-V-VM框架。以下是框架列表:

  • 棱镜/复合WPF()。这一个来自微软模式与实践小组。这里有很多好东西,但是上面三件事中你可以从这里学习的一个例子就是如何使用ICommand。Prism包含一个DelegateCommand,该命令实现ICommand,并简化了M-V-VM中ViewModel命令的使用

  • 卡利本()。最近发布的一个版本中,您可以从中学习到的关键内容之一是如何使用附加行为,该库将其用于“操作”

  • 玛瑙()。免责声明:我是这本书的作者。这一个还没有发布,尽管当前的alpha源是可用的。这为如何为ViewModel提供接口的问题提供了一个新的解决方案


谢谢,我怀疑这一点,目前正在阅读一篇有关命令的MSDN文章: