【问题标题】:MVVM using constructors of UI to pass modelMVVM 使用 UI 的构造函数来传递模型
【发布时间】:2012-10-14 17:52:39
【问题描述】:

我想太多了,让自己陷入了混乱,但无法理清头绪。

我是 WPF 的新手,我正在尝试熟悉 MVVM。我理解这个理论。我需要一个视图、一个模型和另一个模型(称为视图模型)。

但是,如果我的模型是由 View 的构造函数的参数构造的,会发生什么情况。

所以,假设我有一个完全空的项目,唯一的事情是我有一个重载的 MainWindow 构造函数,它采用模型:

public MainWindow(Logging.Logger logFile)
        {
            InitializeComponent();
            this.DataContext = logFile;
        }

模型是日志文件。如果没有单独的 Model 类,我还能实现 MVVM 吗?

任何想法都将不胜感激。

【问题讨论】:

  • 就我个人而言,我完全不明白你在问什么。

标签: mvvm


【解决方案1】:

你想多了。

MVVM 有几个组件:

查看:

视图提供了一个关于数据的视图。视图从视图模型中获取数据

视图模型:

视图模型用于组织您的数据,以便您可以将一个或多个数据源组织成一个可以查看的连贯结构。视图模型还可以执行基本验证。 ViewModel 不了解 UI,因此不应包含对控件、可见性等的引用。viewmodel 从服务中获取其数据。

服务:

服务提供来自外部来源的数据。这些可以是 WCF、Web 服务、MQ 等(你懂的)。服务返回的数据可能需要调整,以便可以在 UI 中显示。为此,您需要从服务中获取原始数据并将其转换为一个或多个模型对象。

型号:

模型对象是已创建的对象,以便可以轻松地显示/使用 UI。

您可能会发现不需要对来自服务的数据进行整形(幸运的是),在这种情况下,无需创建模型对象。您可能还决定不希望您的服务直接与您的视图模型对话,而是让它们通过“中介”对象获取数据。这在某些情况下也很好(通常当您从一个源/多个源接收连续的数据流时)。

MVVM 有点像粥:您可以添加许多潜在的配菜,但您不一定需要全部添加。或者想要。

这有帮助吗?

编辑:刚刚偶然发现:更深入地表达了 MVVM 是什么:Mvvm Standardisation。这也可能有用

【讨论】:

  • 我的服务是通过 UI 的构造函数提供的,因为 logFile 是仅在内存中的对象。也许我需要事先将日志文件保存为 XML 并将其作为服务调用?
  • 目前,根本没有这样的东西——它是一个直接的 WPF 项目和几个类库——我不使用数据库或此类服务,因为它是一个美化的复制和粘贴程序!你的想法是什么? :)
  • 像 MVVM Light 这样非常轻的东西会让你的生活更轻松。它为您设置了所有依赖注入,并使应用程序更易于管理。它几乎没有学习曲线(我将它用于 Windows 应用商店应用程序),因此您可以快速启动和运行。即使您将记录器直接注入到视图中,这也会以一种良好、一致的方式管理此过程并提供灵活性。如果应用程序要增长,那么复杂性将迅速增加。这将让你控制它。
  • 非常感谢,我去看看;我一直对 MVVM Light 保持警惕,因为我想学习 MVVM,但在这种情况下可能会没问题。再次感谢您 +1
【解决方案2】:

Model 是 ViewModel 知道的东西,但 View 不知道。如果您需要提供有关 Logger 的信息,您当然可以拥有一个了解 Logger 的 LoggerViewModel,然后 View 最终会了解 ViewModel。有几种方法可以做到这一点,在视图构造函数中设置 DC 就是其中之一。

在基本了解谁知道谁之后,真正构成 MVVM 架构模式 IMO 的是 ViewModel 通过数据绑定与 View 进行通信。不多也不少。很多好东西都由此产生,但这正是它与其他关注点分离模式(如表示模型、MVP 等)不同的关键所在

也就是说,您需要通过一些示例项目来感受它。当您遇到问题时,在这里提出问题非常棒,但您必须意识到您的问题充其量只是有点模糊。此外,除非您真的希望在视图中显示日志记录信息,否则日志记录不是 MVVM 关注的问题。它很有趣,但不是 MVVM。

Google Josh Smith 在 MSDN 上的 MVVM 演示,这是一个非常丰富但平易近人的入门项目。提出更多问题或在此处改进问题!

HTH,
浆果

【讨论】:

    【解决方案3】:

    忘记风景!至少在一开始;)

    试着想想你想要什么,你需要什么。我的理解是你想处理一个日志文件。所以你需要一个视图模型。

    public class LoggerViewmodel{}
    

    您可以将日志文件作为 vm ctor 的参数。现在你必须考虑你想用你的日志文件做什么?为您想要在视图模型上创建一个属性(LastModified、LastRow 等)的所有内容。

    顺便说一句,mvvm 有两种不同的方法,第一种是 view first,另一种是 viewmodel first。我在我的项目中都这样做,并采用更适合我的方法(视图模型最先;))来满足我的需求。

    请编辑您的问题并添加您想要对日志文件执行的操作,然后我们可以为您提供更好的答案。

    编辑:

    如果没有单独的 Model 类,我还能实现 MVVM 吗?

    以简短的方式回答您的问题 - 是的,您可以。您必须将视图和视图模型分开,并使用绑定将视图绑定到数据上下文(视图模型)。

    【讨论】:

    • 谢谢你。这将有助于在未来更好地考虑项目
    猜你喜欢
    • 2015-03-31
    • 2011-05-06
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多