【发布时间】: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