UWP:传递MainPage.cs和视图之间的数据\ Page.cs

时间:2019-02-01 20:40:09

标签: c# uwp

我有一个MainPage,其中包含我的NavigationView的代码。 MainPage导航到带有frame.navigate()的页面。其中一页包含用于用户输入数据的文本框。我想采取输入的数据,并用它来改变所显示的另一页。

我在这里看过很多类似的文章,它们将数据从一个视图传递到另一个视图,它们都使用frame.navigate(typeof(page),parameter)。但我的参数不在的MainPage,其中我有导航控制。

MainPage.xaml

<Page>
<Grid>
    <NavigationView x:Name="nvTopLevelNav">
        <NavigationView.MenuItems>
            <NavigationViewItem Icon="Setting" Content="Page1" Tag="Page1" />
            <NavigationViewItem Icon="Rotate" Content="Page2" Tag="Page2" />
            </NavigationView.MenuItems>
        <Frame x:Name="contentFrame"></Frame>
    </NavigationView>
</Grid>
</Page>

MainPage.xaml.cs:

namespace App
{
public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
    }
    #region NavigationView event handlers
    private void nvTopLevelNav_Loaded(object sender, RoutedEventArgs e)
    {        
        // set the initial SelectedItem
        foreach (NavigationViewItemBase item in nvTopLevelNav.MenuItems)
        {
            if (item is NavigationViewItem && item.Tag.ToString()=="Page1")
            {
                nvTopLevelNav.SelectedItem = item;
                break;
            }
        }
    }
    private void nvTopLevelNav_SelectionChanged(NavigationView sender, NavigationViewSelectionChangedEventArgs args)
    {
        Windows.UI.Xaml.Controls.NavigationViewItem Item = args.SelectedItem as Windows.UI.Xaml.Controls.NavigationViewItem;

        if (Item.Tag is string ItemTag)
        {
            switch (ItemTag)
            {
                case "Page1":
                    contentFrame.Navigate(typeof(SettingsPage));
                    sender.Header = "Page1";
                    break;

                case "Page2":
                    contentFrame.Navigate(typeof(Page2));
                    sender.Header = "Page2";
                    break;
            }
        }
    }
}
}

的Page1.xaml

<Page>
<Grid>
    <Button Name="OutputFolderButton" Click="OutputFolderButtonClick">
        <Image  x:Name="FileButton" Source="Assets/FileButton.png"/>
    </Button>
    <ToggleSwitch Name="ToggleSwitch" Toggled="SwitchToggled"/>
    <TextBox Name="TextBox1" TextChanged="TextBox1Changed"/>
    <TextBox Name="TextBox2" TextChanged="TextBox2Changed"/>
    <TextBox Name="TextBox3" TextChanged="TextBox3Changed"/>
    <TextBox Name="TextBox4" TextChanged="TextBox4Changed"/>
</Grid>
</Page>

Page1.xaml.cs:

namespace App
{
public sealed partial class SettingsPage : Page
{
    public SettingsPage()
    {
        InitializeComponent();
    }

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);

    }
    public async void OutputFolderButtonClick(object sender, RoutedEventArgs e)
    {
        var picker = new Windows.Storage.Pickers.FolderPicker
        {
            SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.ComputerFolder
        };
        picker.FileTypeFilter.Add("*");

        Windows.Storage.StorageFolder outputFolder = await picker.PickSingleFolderAsync();
        if (outputFolder != null)
        {
            OutputFolderTextBox.Text = outputFolder.Path;
            OutputFolderTextBox.FontStyle = Windows.UI.Text.FontStyle.Normal;
        }
    }
    private void SwitchToggled(object sender, RoutedEventArgs e)
    {
    }
    private void TextBox1Changed(object sender, TextChangedEventArgs e)
    {
    }
    private void TextBox2Changed(object sender, TextChangedEventArgs e)
    {
    }
    private void TextBox3Changed(object sender, TextChangedEventArgs e)
    {
    }
    private void TextBox4Changed(object sender, TextChangedEventArgs e)
    {
    }
}
}

我希望TextChanged事件将数据传递到MainPage,以便可以将所有日期都放在一个位置。有了MainPage中的所有数据,然后我可以将其传递给其他页面。

1 个答案:

答案 0 :(得分:1)

Xeorge是对的。一般来说,您可以将数据保存在单独的数据层中,并且每个VM都可以访问该数据层以获取所需的数据。这实际上是您的最佳实践。

为使这一点更加清楚,请检查官方文档:Data binding and MVVM 有关示例的更多信息,您可以从上面的文档中看到: “有关使用基本的现成MVVM的其他指导,请查看GitHub上的Customers Orders Database sample。其他UWP app samples的其他人也使用了基本的MVVM体系结构,而{{3} }包括代码隐藏版本和MVVM版本,并带有说明Traffic App sample的注释。”