我已经通过以下方式解耦了这个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在视图中触发事件,因此它甚至不必是一个调用它的元素,例如单元测试类?将MVP模式应用于ASP.NET应用程序时,使用AJAX发布数据的位置是什么?我所知道的MVP模式,UI就是那个(外观),所有繁重的工作都是在演示者中完成的.我不知道你如何遵循这种模式,仍然使用AJAX与客户端上的Web服务进行交互.有没有人有关于如何使用AJAX和Web服务并仍然遵循MVP模式的任何参考?
谢谢!
我在C#Forms应用程序中实现了MVP模式(被动视图).
在我的例子中,该模型是一个电机控制器激光系统,其中模型实际上就像两个其他模型的外观(一个是电机控制系统,另一个是激光系统).
我的演示者是处理用户界面的视图的模型事件和方法的中介.
假设我的视图有激光功率的设置.用户将此值设置为某个值,该值将发送到演示者,演示者又将请求发送到模型.如果激光功率超出范围,我的模型会抛出一个由我的演示者捕获的错误.
如何最好地将此消息传达给用户?在我看来,我想过制作一种方法; HandleError(字符串消息),并从演示者调用此方法.
这是我使用MVP的第一个项目,所以我没有经验说出哪种方式是最好的方式.
我已经开始了一个GWT项目,我决定试试UiBinder.我很难在UiBinder上面放置一个MVP模式.
当我使用GWT-pure-java时:我会使用Gin为我的演示者注入相应的视图.这是非常直接的,如果我想将一个id传递给演示者,那么我只需将一个id传递给演示者的构造函数.
与UiBinder不太直接.我几乎可以肯定我错过了一些东西,因为很多人都声称UiBinder和MVP是在天堂做的比赛......所以我希望能在这个问题上得到一些坚实的回答;-)
我在几个简单的GWT-UiBinder示例中看到的是,视图是由绑定器创建的,然后是:
@UIFactory方法构造演示者.使用第一种方法,如果在视图中构建演示者,如何将id传递给演示者?你会这样做view.getPresenter().setId(42);,然后主持人会去服务器获取一些信息,并要求视图显示它......闻起来很糟糕.
使用第二种方法,最终会得到一个非直观的对象图,其中不清楚谁是消费者,谁是生产者.此外,在视图需要来自演示者的信息(几乎所有用例都需要此信息)的情况下,人们会做什么:
//some code would create the presenter pass it the id and then call view.setPresenter
class MyView {
void setPresenter(MyPresenter p) {
this.presenter = p;
//OK now that i have my presenter how do I ask it to fetch data from the server.
//do i turn around and do: presenter.setView(this); and then the presenter takes
//over and uses the view to display the data?
}
}
Run Code Online (Sandbox Code Playgroud)
这同样很臭......很抱歉这篇长篇文章,并提前感谢...
我正在使用MVP设计模式,我已经将我的演示者注册为我视图中各种按钮和其他交互元素的监听器.这很好用,每当用户在GUI中执行某些操作时,我都会收到通知.
但是,我没有在模型更改时通知演示者的过程.我从一个服务器进入数据,该服务器在例如User模型中处理,并更改我的User对象的值.
如何通知演示者模型在Java中已更改?
我是否让我的模型持有对演示者的引用,并presenter.userObjectHasBeenUpdated()在我更改了User对象后显式调用了我的模型中的内容?或者有没有办法在User对象上放置一个侦听器,presenter.userObjectHasBeenUpdated()当User对象被修改时会自动调用?
可能答案是"你不能",因为在Mosby 2.0中你需要使用片段并将其设置为setRetainInstance(true)以保留Presenter.而Conductor的目标是消除使用Fragments的需要,因此无法在应用程序的任何位置使用setRetainInstance(true).
但也许有另一种方式..
我目前正在开发Android应用程序,我选择了MVP-Arhitecture.我的问题是现在,我需要从模型中的数据库中读取和写入一些东西,但是因此你需要一个对Context的引用,它在View中.我想知道,如何在不破坏MVP架构的情况下从View到模型获取Context(如果可能的话).
谢谢!!!
让我们说例如我们有一个带有2个选项卡和一个文件菜单的WPF窗口.文件菜单有两个项目"隐藏选项卡1","显示选项卡1"
然后该程序具有以下类:MainView.xaml
MainViewModel.cs
然后将"隐藏选项卡1"菜单命令绑定到MainViewModel.cs中包含的HideTab1Command
然后,HideTab1直接与视图交互以隐藏ViewModel中的tab1.
这在技术上不是MVVM行为(更像是MVP)吗?例如,对于真正的MVVM,执行此行为的功能应完全包含在XAML代码中或MainView.xaml.cs中的"代码隐藏"中?
我看到MVVM应用程序和示例一直这样做,但它似乎打破了SRP(单一责任原则).
我看到一些其他应用程序使用HideTab1命令执行相同的操作,只需通过接口IMainView通知视图,然后调用MainView.xaml.cs中的代码
虽然我可以看到代码现在在View中,但这与第一个例子有什么不同?SRM仍然无效,ViewModel告诉View该做什么.
这些示例中的任何一个都是真正的MVVM模式,如果不是,那么实现隐藏/显示"选项卡1"的正确MVVM模式是什么.
请原谅任何对MVVM/MVP的误解,我正在尽力正确地学习这些设计模式.
示例:ShowTab1是一个命令,然后直接操作View.我一直在MVVM项目中看到这一点(许多DevExpress示例)但它似乎没有MVVM的任何好处,因为您的ViewModel直接操纵您的视图.
MainWindow.xaml
<Window x:Class="WpfApplication.MainWindow"
...
<Button Content="Show hidden panels" Command="{Binding ShowTab1}"/>
...
<TabGroup>...
...
</Window>
Run Code Online (Sandbox Code Playgroud)
MainWindowViewMode.cs
public class MainViewModel
{
IMainView mainView;
public MainViewModel()
{
ShowTab1 = new ShowTab1Command(this);
mainView = ... (set this to a reference to the view)
}
public ICommand ShowTab1 { get; set; }
}
public class ShowTab1Command: ICommand
{
private readonly MainViewModel _model;
public ShowTab1Command(MainViewModel model)
{
_model = model;
}
void ICommand.Execute(object parameter) …Run Code Online (Sandbox Code Playgroud) 我正在使用MVP构建应用程序,而我正在使用存储库模式.我有一个本地数据源,这是一个存储某些信息的数据库.我有一个远程数据源,在其中使用Retrofit,我发出了API请求.该请求有一个@Query,这是一个存储在SharedPreferences中的String.我想将SharedPreferences作为数据源添加到存储库,但由于远程数据源应该使用这些SharedPreferences--这将是与远程数据源不同的数据源 - 我不再认为这种体系结构如此清晰.
非常感谢您的帮助.
mvp android repository-pattern android-sharedpreferences retrofit2
我一起使用Kotlin和MVP,偶然发现了一点烦恼.
我收到了"意外覆盖"错误(从下面可以看出).除了在MainView界面中更改成员变量名称或getX()之外,是否有任何解决方案.
根据我的研究,没有办法阻止kotlin为'x'生成吸气剂.
class MainActivity : Activity(), MainView {
val x: String // Accidental override
override fun getX(): String {
return x
}
}
interface MainView {
fun getX(): String
}
Run Code Online (Sandbox Code Playgroud) mvp ×10
android ×4
c# ×2
mvvm ×2
wpf ×2
ajax ×1
architecture ×1
asp.net ×1
decoupling ×1
events ×1
gwt ×1
java ×1
kotlin ×1
mosby ×1
observable ×1
retrofit2 ×1
uibinder ×1
web-services ×1