![]() |
叛逆的长颈鹿 · start-pulseaudio-x11 ...· 2 月前 · |
![]() |
玩命的莴苣 · Azkaban快速入门系列(3) | ...· 1 年前 · |
![]() |
谦虚好学的太阳 · laravel ffmpeg ...· 1 年前 · |
我正在构建一个基于WPF的销售点系统来练习使用MVVM.我没有使用任何MVVM框架,而是在Josh Smith http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090030 的文章中使用了 http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090030 类。
我以前写过一个,没有应用MVVM模式(仍然使用WPF)。
对于数据库访问,我使用了实体框架。看起来是这样的:
我的问题是,如何使用MVVM实现这一点?首先,我已经使用MVVM编写了
Login
窗口,我的直接问题是,
Login
窗口(释放它)并打开
MainWindow
MainWindow
只包含屏幕截图的顶部部分,即按钮行。
View
和
ViewModel
,只将
MainWindow
用作将所有东西组合在一起的地方?
ViewModel
将告诉
MainWindow
的
ViewModel
将各自的
View
s (在非MVVM版本中使用
System.Windows.Controls.Page
)加载到
Frame
中?在非MVVM版本中,我使用的代码相当简单:
私有空btnCheckout_Click(对象发送方,RoutedEventArgs e) { mainFrame.Navigated += frame_Navigated;var pgCheckout =新pgCheckout();mainFrame.Navigate(pgCheckout);//框架}
Page
加载到
Frame
中?
发布于 2013-05-10 09:30:41
如果您不使用任何现有的框架,您将不得不自己创建一个框架。海事组织,你可以从中受益,因为你控制了一切,但你也必须重新发明很多东西。我可以描述我们是如何做到的,无论它是对是错,让这里的投票决定:)
首先,您不想用任何与UI相关的对象来污染ViewModel代码。但是,ViewModel是关于视图逻辑的,您需要以某种方式控制表示(导航、用户消息.)。因此,您可以在视图模型中引入某种视图服务,它控制与视图相关的逻辑,但不依赖UI框架中的任何内容。我们可以这样说:
public interface IViewService
//show message dialog with message text
void ShowMessageDialog(string message);
//show Yes/No message dialog with message text. Retrun true if answer is Yes
bool AskQuestion(string message);
//Navigate to some other viewmodel
void NavigateTo(ViewModel someOtherViewModel);
}
您必须使用WPF相关逻辑创建这种服务的具体实现。如何实现该方法取决于您和您正在使用的UI框架(在本例中是WPF)。
在视图模型中,您需要以某种方式获得实现
IViewService
的对象。您可以通过使用依赖项注入来注入它,使用服务定位器获取实例,甚至有一些硬编码的静态单例实例。(IMO依赖项注入是一种方法,但也使事情更加复杂,您需要引入DI容器并使用DI容器创建所有视图模型实例)。
在命令中,您可以调用服务的方法。
假设您的LoginCommand of your LoginViewModel (登录按钮绑定到的
RelayCommand
)
private void ExecuteLoginCommand(object parameter)