c# - WPF一个ViewModel作为MainWindow的属性,如何正确地从页面访问ViewModel?

标签 c# .net wpf xaml mvvm

我在WPF和.NET C#中还很陌生,但仍然可以制作一页应用程序。当我要有2页并且它们之间有导航时,问题开始了。我有一个ViewModel和2个页面:KlantenPage.xaml.cs(具有Klanten.xaml View )和BookingPage.xaml.cs(具有BookingPage.xaml View )。我在主窗口中有两个导航按钮。我也想在关闭事件时将数据保存在两个页面中。
我的MainWindow.xaml

<Window x:Class="KlantenAppWPF.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:KlantenAppWPF"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
<DockPanel>
    <StackPanel>
        <Button x:Name="Klanten" Height="35" Width="100" Content="Toon klanten" IsEnabled="False" Click="NavigateToKlanten"/>
        <Button x:Name="Bookingen" Height="35" Width="100" Content="Toon bookingen" IsEnabled="True" Click="NavigateToBookingen"/>
    </StackPanel>
    <Frame x:Name="MainFrame" Source="KlantenPage.xaml" NavigationUIVisibility="Visible" Visibility="Visible"></Frame>
</DockPanel>

我的MainWindow.xaml.cs:
public partial class MainWindow : Window
{
      MainViewModel _viewM = null;
      public MainViewModel ViewM
      {
          get { _viewM ??= new MainViewModel(); return _viewM; }
          set => _viewM = value;
      }
  
    public MainWindow()
    {
        InitializeComponent();
        ViewM.KlantenLijst.Import();//load data from json file
        ViewM.BookingLijst.Import();//load data from json file
        DataContext = ViewM;
  }
    protected override void OnClosing(CancelEventArgs e)
    {            
        ViewM?.BookingLijst?.SaveData();//export to json file with all changes, done by the user
        ViewM?.KlantenLijst?.SaveData();//export to json file with all changes, done by the user
        base.OnClosing(e);
    }

    private void NavigateToBookingen(object sender, RoutedEventArgs e)
    {   ViewM?.KlantenLijst?.SaveData();
        MainFrame.Navigate(new Uri("BookingPage.xaml", UriKind.RelativeOrAbsolute));            
        Bookingen.IsEnabled = false;
        Klanten.IsEnabled = true;
    }
    private void NavigateToKlanten(object sender, RoutedEventArgs e)
    {   
        ViewM?.BookingLijst?.SaveData();
        MainFrame.Navigate(new Uri("KlantenPage.xaml", UriKind.RelativeOrAbsolute));            
        Bookingen.IsEnabled = true;
        Klanten.IsEnabled = false;
    }
因此,我创建了一个MainViewModel类的实例(= ViewM),但是我的页面无权访问此实例。
我的KlantenPage.xaml.cs看起来像这样:
public partial class KlantenPage : Page
{ 

  // MainViewModel ViewM = ??????????.ViewM;
  //I really don't know how to call the ViewM property of MainWindow here. 
          
    public KlantenPage()
    {
        InitializeComponent();
        //DataContext = ViewM;
    }
如何将页面连接到mainWindow?我将不胜感激任何帮助。

最佳答案

MVVM体系结构基于仅通过 View 模型将数据从模型传输到 View
因此,您应该按照体系结构 DRY 规则,对每个 View 使用 View 模型
这样,您可以在 View 和 View 模型之间保持1:1的关系。
不一定总是这样,但是因为这是您在MVVM世界中的起点,所以我建议您为程序中的每个页面创建一个 View 模型,并将它们连接到相同的模型(女巫是您的后继-最终算法和逻辑),这就是您应该如何在页面之间传输数据。

关于c# - WPF一个ViewModel作为MainWindow的属性,如何正确地从页面访问ViewModel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62574393/

相关文章:

c# - 无法使 MSMQ WCF 窗口服务运行

c# - 将不同的东西组合在一起,以便使用最少的代码同时激活/停用它们

c# - 确定匿名类型的属性是否为泛型集合

c# - GOTO 是退出双 Foreach 的唯一方法吗?

c# - 是否可以从 .net 代码调试到 SQL Server 存储过程代码?

c# - .NET:如何开发用户可以使用鼠标进行电子签名的功能?

c# - 在 WPF 中设置和删除工具提示

c# - 如何为 NLog 设置每个请求的全局变量?

wpf - 当应用失去焦点时,Mahapps标题栏会更改颜色

c# - 如何获取 WPF 应用程序的发布版本