【问题标题】:WPF application using MVVMCROSS使用 MVVMCROSS 的 WPF 应用程序
【发布时间】:2014-03-31 06:30:08
【问题描述】:

我最近遇到了 MVVMCROSS,我认为这是解决跨平台问题的好主意。所以我很想移植一个我正在开发的应用程序和我的整个库,以使它们更便携。现在我正在尝试将我的视图模型绑定到视图,我面临着几个问题和疑问......

我已经看到了导航如何工作以及如何启动第一个可以正常工作的视图的示例。但是,对于我的应用程序,我不能使用它。我的主视图由窗口顶部的菜单栏组成,可以从中调用视图。主窗口包含以下内容:

  <Grid Height="Auto" Width="Auto">
<Grid.RowDefinitions>
  <RowDefinition Height="30" />
  <RowDefinition Height="*" />
</Grid.RowDefinitions>
<Menu Name="MainMenu"
      Height="25"
      Width="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type Grid}}}"
      Grid.Row="0">
  <MenuItem Header="Tools" Width="Auto">
    <MenuItem Header="Solar estimator" HorizontalAlignment="Left" Width="Auto" Click="Menu_Click"/>
  </MenuItem>
</Menu>
<DockPanel Grid.Row="1" Name="DockPanel" Height="Auto" Width="Auto">

</DockPanel>

所以我想做的是,每当我从菜单中调用一个新视图时,我都会将它附加到停靠面板。

函数 Menu_Click 有这样的代码:

      EnergyNeedsEstimatorView estimatorView = new EnergyNeedsEstimatorView();
  double estimatorViewHeight = estimatorView.Height;
  double estimatorViewWidth = estimatorView.Width;
  estimatorView.SetValue(UserControl.WidthProperty, double.NaN);
  estimatorView.SetValue(UserControl.HeightProperty, double.NaN);
  DockPanel.Children.Add(estimatorView);
  DockPanel.Height = estimatorView.Height;
  DockPanel.Width = estimatorView.Width;
  this.Height = estimatorViewHeight + MainMenu.Height + SystemParameters.WindowCaptionHeight + SystemParameters.ResizeFrameHorizontalBorderHeight;
  this.Width = estimatorViewWidth + SystemParameters.ResizeFrameVerticalBorderWidth + 10;

但是视图显示正常,因为我从我的核心库中明确删除了 IMvxAppStart 部分,并从我的桌面库中的 DoSetup 中删除了 IMvxAppStart Resolve,因此不再建立视图模型和视图之间的链接。我想我可以像以前一样在我的视图中指定它的 DataContext 是视图模型,它会像我在使用 MVVMCross 之前一样工作,但我觉得这不是最好的方法。

所以您可能想知道,为什么不将菜单栏添加到每个视图,而不是尝试将我的视图附加到停靠面板?好吧,当我需要进行更改时,我不想到处更改菜单栏。所以我试图有一个通用的主窗口来显示所有视图。现在我陷入困境并试图弄清楚如何使用 MVVMCross 做到这一点..

有什么想法吗?

【问题讨论】:

  • 事实证明,如果我手动将模型关联到视图的 DataContext,它可以正常工作。毫不奇怪,这就是我使用自己的 MVVM 框架的方式。所以现在,问题仍然存在......任何人都知道如何根据您在菜单中访问的选项和拥有它的方式从附加视图的位置获得一个 MAINVIEW,以便 MVVMCROSS 绑定视图和模型而不必通过DataContext手动绑定?
  • 在其中添加 wpf 和 mvvm 标签将帮助您获得非常好的答案。

标签: wpf mvvm desktop-application mvvmcross


【解决方案1】:

如果您要求容器为您创建一个 View,那么它会自动尝试为您加载一个 ViewModel - 请参阅 https://github.com/MvvmCross/MvvmCross/blob/v3.1/Cirrious/Cirrious.MvvmCross.Wpf/Views/MvxWpfViewsContainer.cs 中的代码

所以你可以用调用来替换你的new

 car view = Mvx.Resolve<IMvxWpfViewsContainer>().CreateView(MvxViewModelRequest<MyViewModel>.GetDefaultRequest()):

但是,通常在 mvvmcross 中,ViewModel 和应用程序不直接与容器对话 - 相反,它们与 Presenter 对话,最好修改代码以使用 Presenter。在这个流程中,您的菜单将 - 发送 Presenter ViewModelRequest 对象 - 演示者然后向容器询问视图 - 容器加载视图并为其提供有关其 ViewModel 的信息(如何完成取决于平台和视图)。 - 演示者然后可以以某种方式在显示器(通常是窗口)上实际显示视图。

在其他框架中,您可能会听到使用术语 navigation service 而不是 Mvx 所称的 Presenter

【讨论】:

  • 有趣。然后我将研究 Container 和 Presenter 机制。我找到了一种解决问题的方法,让一切正常,同时仍然使用 MVVMCRoss 的模型和视图机制。然而,我们的想法是尝试并使用 MVVMCross 提供的最大值。所以我会看看演示者和容器如何帮助我。
  • 我还没查,但是有没有关于如何使用演示者的好教程?
  • 我刚尝试更换新的并收到此错误:无法解析类型 Cirrious.MvvmCross.Wpf.Views.IMvxWpfViewsContainer ..我的模型中可能缺少注册..
  • 有这方面的教程吗?希望为 Windows 和 mac 构建应用程序......不确定这个框架是正确的选择。
  • 嗨 Stuart,我如何从 viewmodel 对象(而不是 viewmodelrequest)创建 wpf 视图? mvvmcross 支持吗?
猜你喜欢
  • 2021-01-14
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
  • 2022-10-24
  • 1970-01-01
相关资源
最近更新 更多