我有两个相同的视图View1.xaml和View2.xaml,它们都有一个按钮button1和一个textfield textfield1.我们的想法是,当您按下按钮时,相应的文本字段会填充一些信息.两个视图都使用相同的方法填充文本
我的问题是:如何使用OOP原则编写通用代码而不破坏MVVM模式?我目前使用RelayCommand执行此操作的方法:
ViewModel1和ViewModel2的代码相同:
public RelayCommand ButtonCommand { get; private set; } #Constructor ButtonCommand = new RelayCommand(ExecuteButtonCommand, CanExecuteButtonCommand); #EndConstructor private void ExecuteButtonCommand(object message) { //Some method to fill the corresponding textfield } private bool CanExecuteButtonCommand(object message) { return true; }
绑定View1.xaml和View2.xaml中的按钮:
<Button Command="{Binding Path=ButtonCommand, Mode=OneWay}" />
这很糟糕,因为我必须为两个ViewModel编写相同的代码.我试图创建一个继承自RelayCommand的ButtonCommand类,但由于并非每个视图都具有此功能,因此我无法使用此方法实现它.
您的两个视图模型不是使用“基础”视图模型和两个派生视图模型,而是使用在别处定义的相同代码(理想情况下,两者都调用相同的接口,注入依赖注入).这是基于继承的组合原则.
在编写测试时,测试两个视图模型都调用接口,并测试该接口的实现是否完成了它应该执行的操作.
这样,您不仅可以避免两次编写代码,还可以避免两次测试,还可以遵循单一责任原则等其他原则.