我在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/