【问题标题】:MVVMCross How to display a view within a viewMVVMCross 如何在视图中显示视图
【发布时间】:2021-01-16 19:29:00
【问题描述】:

我是 MVVMCross 包和 C# 的新手。我花了一天的大部分时间试图找出我不理解的内容,阅读有关演示者和导航等的文档以尝试理解,但我错过了一些东西。

我最初创建了一个没有实现 MVVM 的 WPF 应用程序,现在我想转换,但我在这部分苦苦挣扎。我希望有一个主菜单,它是“MainWindow”(如 shell)中网格的一部分,其中页面的剩余部分(和网格列 2)用于显示嵌套视图。

最终,我只是想在原始 WPF 应用程序中重现相同的分层控件。在该应用程序中有一个内容控件,它占据了大部分表单,其内容属性根据用户的选择设置为不同的表单。

MainWindow.xaml.cs

public partial class MainWindow : MvxWindow
{
    public MainWindow(IMvxNavigationService navService)
    {
        InitializeComponent();
        DataContext = new MainViewModel(navService);

        //content.Content = new AdminMenuView();

    }
}

MainViewModel.cs

    private MvxViewModel _nextMenuContent;

    public MainViewModel(IMvxNavigationService navService)
    {
        _navService = navService;            
        MoveMenuCommand = new MvxCommand(MoveMenu);
        ChildViewModel = new AdminMenuViewModel();
        GoToAdminMenu = new MvxCommand(SelectAdminMenu);

    }

MainView.xaml

<ContentControl Content="{Binding ChildViewModel}"/>  

***网格和列都工作正常

MainView.xaml.cs

public partial class MainView : MvxWpfView
{
    public MainView()
    {
        InitializeComponent();
        
    }
}

AdminMenuModel.cs

public class AdminMenuViewModel : MvxViewModel
{
    private readonly IMvxNavigationService _navService;

    public AdminMenuViewModel()
    {
        Initialize();
        
    }

    public override void Prepare()
    {
        base.Prepare();
    }

    public override async Task Initialize()
    {
        await base.Initialize();
    }



}

AdminMenuModel.xaml.cs

    public partial class AdminMenuView : MvxWpfView
{
    public AdminMenuView()
    {
        InitializeComponent();
    }

    public new AdminMenuViewModel ViewModel
    {
        get { return base.ViewModel as AdminMenuViewModel; }
        set { base.ViewModel = value; }
    }

}

当我调用 AdminMenuViewModel 时,它会运行,但是如果我将“ChildViewModel”绑定到内容控件的 DataContext 属性和 AdminMenuViewModel 的路径字符串,那么我在内容控件中得到的只是一个空白屏幕将其绑定到 content 属性。

【问题讨论】:

标签: c# wpf mvvm data-binding mvvmcross


【解决方案1】:

您必须将 MainViewModel 设置为主窗口的 DataContext

public MainWindow(IMvxNavigationService navService)
{
    DataContext = new MainViewModel(navService);
    InitializeComponent();
}

【讨论】:

  • 我尝试了您的修改,但我收到以下错误“MissingMethodException:找不到类型'MvxStarter.WPF.MainWindow'的默认构造函数。”没有它,它开始很好。假设这应该在没有 ViewModel 的 MainWindow.xaml 后面的代码中。我错过了什么?
  • 进行了编辑。我注意到我在 MainView.xaml.cs 部分粘贴了 MainWindow。对此感到抱歉。
  • 我不知道 MVVMCross 中的工作原理,但 MainWindow 期望 IMvxNavigationService 传递给它。您是否使用依赖注入来获得它?是这样配置的吗?
  • 没有帮助?
  • 您可以使用 WpfSnoop 并检查您的窗口上是否设置了 DataContext。您还可以在 VS 输出窗口中看到绑定错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多