2

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

继续解耦的最佳方式是什么?

Shell.xaml:

<Button x:Name="btnProcess"
        Content="Process"
        Margin="10"/>

引导程序.cs:

public void Run()
{
    Shell shell = new Shell(new Customer());
    shell.Show();
}

Shell.xaml.cs:

public Shell(IPerson person)
{
    InitializeComponent();
    btnProcess.Click +=new RoutedEventHandler(person.Process);
}

客户.cs:

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

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

但现在:

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

4 回答 4

5

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

于 2009-03-19T12:59:03.647 回答
3

Cameron MacFarland 在这里做得很好,但我可以补充一点。

跟随 MV-VM 时,你的解耦工具是数据绑定、命令、附加行为和接口。数据绑定应该是不言而喻的。您已经对命令进行了很好的描述,但我建议您避免使用 RoutedCommand 并坚持使用 ICommand 实现。附加行为是附加的 DependencyProperty,它们订阅它们所附加的元素上的事件,在这种情况下,将用于将事件处理中继到 ViewModel。接口为您提供了最大的灵活性,但您必须弄清楚如何将接口传递给 ViewModel。现在学习所有这些的最好方法是去谷歌看看现有的 MV-VM 框架。以下是框架列表:

  • 棱镜/复合 WPF ( http://www.codeplex.com/CompositeWPF )。这个来自 Microsoft Patterns & Practices 小组。这里有很多好东西,但是您可以从这里学到的上述三件事的示例之一是如何使用 ICommand。Prism 包含一个 DelegateCommand,它实现了 ICommand 并简化了在 MV-VM 中使用来自 ViewModel 的命令。

  • Caliburn ( http://www.codeplex.com/caliburn )。最近发布的,您可以从中学到的关键内容之一是如何使用附加行为,该库将其用于它的“Actions”。

  • Onyx ( http://www.codeplex.com/wpfonyx )。免责声明:我是这个的作者。这个尚未发布,尽管当前的 alpha 源可用。这为如何为 ViewModel 提供接口的问题提供了一种新颖的解决方案。

于 2009-03-20T11:52:52.760 回答
1

正如陈建议的那样,我会研究命令模式:路由命令

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

于 2009-03-19T14:09:40.857 回答
1

如何将 Processed 方法与专门与按钮
命令的对话分离。将命令放入 IPerson 接口并从 Shell 的 xaml 调用该命令。

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

你将如何继续
我将通过在 Shell 和 IPerson 之间创建一个 ViewModel 来进一步了解 MVVM 路径。ViewModel 旨在具有 1) 绑定所需的属性,以及 2) 需要执行的任何命令。ViewModel 旨在为 UI 提供模型所需的内容。

这是目前的什么模式
?没有。我只看到两个对象,视图和模型。你没有 Presenter、Controller 或 ViewModel。

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

于 2009-03-19T14:12:54.907 回答