C# 如何使用WPF和C创建包含两个子页面的“保存/重置选项”页面

C# 如何使用WPF和C创建包含两个子页面的“保存/重置选项”页面,c#,wpf,mvvm,datacontext,C#,Wpf,Mvvm,Datacontext,我想制作一个包含两个子页面选项的页面。 我遇到的问题是无法从主页的子页访问对象。我应该注意,我只使用DataContext来编写后面的脚本。 下面是一些代码,可以帮助您更好地理解我的意思: StartPage.xaml Page1.xaml page2与之类似,唯一的区别是元素的命名约定 不确定是否有子页面的视图模型, 如果确实有,访问复选框中这些viewmodel属性的一种方法如下所示 var tt = (((_Page as StartPage).frame.NavigationServic

我想制作一个包含两个子页面选项的页面。 我遇到的问题是无法从主页的子页访问对象。我应该注意,我只使用DataContext来编写后面的脚本。 下面是一些代码,可以帮助您更好地理解我的意思:

StartPage.xaml

Page1.xaml page2与之类似,唯一的区别是元素的命名约定


不确定是否有子页面的视图模型, 如果确实有,访问复选框中这些viewmodel属性的一种方法如下所示

var tt = (((_Page as StartPage).frame.NavigationService.Content as Page1).DataContext as Page1ViewModel).IsCBChecked; 

我不知道这个叫做IsCBChecked的对象是什么,但它确实帮助我理解了它是如何工作的。但这并不是仅从导航到的当前页面收集第2页的数据。
using System.Windows.Controls;

namespace WpfApp
{
    /// <summary>
    /// Interaction logic for StartPage.xaml
    /// </summary>
    public partial class StartPage : Page
    {
        public StartPage()
        {
            InitializeComponent();
            DataContext = new StartPage_DataContext(this);
        }
    }
}
using System.Windows.Controls;
using System.Windows.Input;

namespace WpfApp
{
    public class StartPage_DataContext
    {
        private Page _Page;
        public StartPage_DataContext(Page page)
        {
            _Page = page;

            FirstPageCommand = new RelayCommand(() => FirstPage());
            SecondPageCommand = new RelayCommand(() => SecondPage());
            SaveCommand = new RelayCommand(() => Save());
            ResetCommand = new RelayCommand(() => Reset());
        }

        private void FirstPage()
        {
            (_Page as StartPage).frame.NavigationService.Navigate(new Page1());
        }

        private void SecondPage()
        {
            (_Page as StartPage).frame.NavigationService.Navigate(new Page2());
        }

        private void Save()
        {
            //Here is where I need code for saving both "Page1" and "Page2" elements to Settings class.
            //Exeple : Settings._firstCB = Page1.firstCB.IsCheked.Value;
            //         Settings._secondCB = Page2.firstCB.IsCheked.Value;
        }

        private void Reset()
        {
            //Here is where I need code for setting both "Page1" and "Page2" elements to some default values.
            //Exemple : Page1.firstCB.IsCheked.Value = false;
            //          Page2.firstCB.IsCheked.Value = true;
        }

        public ICommand FirstPageCommand { get; private set; }
        public ICommand SecondPageCommand { get; private set; }
        public ICommand SaveCommand { get; private set; }
        public ICommand ResetCommand { get; private set; }
    }
}
<Page x:Class="WpfApp.Page1"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
  xmlns:local="clr-namespace:WpfApp"
  mc:Ignorable="d" 
  d:DesignHeight="300" d:DesignWidth="300"
  Title="Page1">

<Grid Background="White">
    <StackPanel>
        <CheckBox x:Name="firstCB" Content="First Combo Box"/>
        <CheckBox x:Name="secondCB" Content="Second Combo Box"/>
        <ComboBox x:Name="firstCombo">
            <ComboBoxItem Content="First Item"/>
            <ComboBoxItem Content="Second Item"/>
        </ComboBox>
    </StackPanel>
</Grid>
var tt = (((_Page as StartPage).frame.NavigationService.Content as Page1).DataContext as Page1ViewModel).IsCBChecked;