gpt4 book ai didi

c# - WPF MVVM设计问题

转载 作者:太空宇宙 更新时间:2023-11-03 11:04:20 25 4
gpt4 key购买 nike

我正在构建一个基于 WPF 的销售点系统来练习使用 MVVM。我没有使用任何 MVVM 框架,而是使用了 Josh Smith 的文章中的 RelayCommandhttp://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090030

我以前写过一个,没有应用 MVVM 模式(仍然使用 WPF)。
对于数据库访问,我使用了 Entity Framework 。它看起来像这样:

我的问题是,如何使用 MVVM 实现这一点?首先,我已经使用 MVVM 编写了 Login 窗口,我的直接问题是,

  1. 如何关闭 Login 窗口(处理它)并打开 MainWindow
  2. 在非 MVVM 版本中,MainWindow 仅包含屏幕截图的顶部部分,即按钮行。
  3. 我是否应该将“按钮栏”进一步拆分为它自己的 ViewViewModel,仅使用 MainWindow 作为放置所有内容的地方一起?
  4. 如果是这样,我该如何编写代码,当单击按钮时,“按钮栏”的 ViewModel 会告诉 MainWindowViewModel 将相应的 View(我在非 MVVM 版本中使用 System.Windows.Controls.Page)加载到 Frame?在非 MVVM 版本中,我使用的代码相当简单:

    private void btnCheckout_Click(object sender, RoutedEventArgs e) {
    mainFrame.Navigated += frame_Navigated;
    var pgCheckout = new pgCheckout();
    mainFrame.Navigate(pgCheckout); //The frame
    }
  5. 如果没有,如何将另一个 Page 加载到 Frame 中?

最佳答案

如果您不使用任何现有框架,则必须自己创建一个。 IMO 你可以从中受益,因为你可以控制一切,但你也必须重新发明很多东西。我可以描述我们是如何做到的,无论是对还是错,让这里的投票决定:)

首先,您不想用任何与 UI 相关的对象污染 ViewModel 代码。但是,ViewModel 是关于 View 逻辑的,您需要以某种方式控制表示(导航、用户消息...)。因此,您可以在控制 View 相关逻辑的 View 模型中引入某种 View 服务,但不依赖于 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)。

在您的 View 模型中,您需要以某种方式获取实现IViewService 的对象。您可以使用依赖注入(inject)来注入(inject)它,使用服务定位器获取实例,甚至有一些硬编码的静态单例实例。 (IMO 依赖注入(inject)是可行的方法,但也使事情变得更加复杂,您需要引入 DI 容器并使用 DI 容器创建所有 View 模型实例)。

然后您可以在您的命令中调用服务的方法。

假设您的 LoginViewModel 的 LoginCommand(登录按钮绑定(bind)到的 RelayCommand)

private void ExecuteLoginCommand(object parameter)
{
bool loginOk = Login(.....);
if(loginOk)
viewService.NavigateTo(new MainWindowViewModel);
else
viewService.ShowMessage("Login failed");
}

最重要的是,ViewModel 控制着表现相关的逻辑,但对背后的 UI 框架一无所知。所有“WPF”代码都在实现 IViewService 的类中。在您的 View 模型中,您“编程到界面”,因此您不会与 WPF 逻辑紧密耦合,您的 View 模型是“可测试的”,您甚至可以在其他一些 UI 平台上重用相同的 View 模型代码。

关于c# - WPF MVVM设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16477994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com