我已经通过以下方式解耦了这个WPF应用程序中的事件。
继续脱钩的最佳方法是什么?
Shell.xaml:
<Button x:Name="btnProcess"
Content="Process"
Margin="10"/>
Bootstrapper.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);
}
Customer.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进行对话,以便它甚至不必是一个完全调用它的元素,例如单元测试课?答案 0 :(得分:5)
我建议您使用命令而不是经典事件来实现事件处理。 它在WPF中很容易,因为命令模式已经实现,你可以告诉你所有的UI输入(按钮,菜单项......)他们的命令是[你的命令的名字]并在一个地方处理所有这些。
答案 1 :(得分:3)
Cameron MacFarland在这里做得很好,但我可以补充一点。
当关注M-V-VM时,框中用于解耦的工具是数据绑定,命令,附加行为和接口。数据绑定应该是不言而喻的。你已经对命令有了很好的描述,但我建议你避免使用RoutedCommand并坚持使用ICommand实现。附加的行为附加了DependencyProperty,它们在它们所附加的元素上订阅事件,并且在这种情况下将用于将事件处理中继到ViewModel。接口为您提供了最大的灵活性,但您必须弄清楚如何将接口传递给ViewModel。现在学习所有这些的最好方法是谷歌并查看现有的M-V-VM框架。这是一个框架列表:
棱镜/复合WPF(http://www.codeplex.com/CompositeWPF)。这个来自Microsoft Patterns&amp;实践小组。这里有很多好东西,但是你可以从这里学到的三个例子中的一个例子就是如何使用ICommand。 Prism包含一个DelegateCommand,它实现ICommand并简化了M-V-VM中ViewModel的命令。
Caliburn(http://www.codeplex.com/caliburn)。最近发布的,你可以从中学到的一个关键事项是如何使用附加行为,这个库用于它的“动作”。
Onyx(http://www.codeplex.com/wpfonyx)。免责声明:我是这一个的作者。虽然目前的alpha源可用,但尚未发布此版本。这个解决了如何为ViewModel提供接口的问题。
答案 2 :(得分:1)
正如Chen建议的那样,我会调查Command模式:Routed commands
我可以在他的博客Jaime Rodriquez上找到一个可以从中学到很多东西的工作实例:Southridge
答案 3 :(得分:1)
如何将Processed方法与特定于Button的方式分离
命令。在IPerson接口中放置一个命令,并从Shell的xaml中调用该命令。
如何更改视图的其他元素
属性和绑定。如果您有一个显示状态的属性(已处理/未处理),则可以使用绑定直接在xaml中显示该属性。
你会如何继续
通过在Shell和IPerson之间创建一个ViewModel,我将更多地沿着MVVM路径前进。 ViewModel旨在具有1)绑定所需的属性,以及2)任何需要执行的命令。 ViewModel旨在为UI提供模型所需的内容。
这是什么模式
目前?没有。我只看到两个对象,View和Model。您没有Presenter,Controller或ViewModel。
对于WPF,我更喜欢ViewModel。有关MVVM的更多信息,请参阅this问题。