UWP:在主页.cs和视图页面.cs之间传递数据



我有一个主页,里面有我的导航视图的代码。MainPage 导航到带有 frame.navigate() 的页面。其中一个页面包含用户输入数据的文本框。我想获取输入的数据并使用它来更改另一页上显示的内容。

我在这里看了很多关于将数据从一个视图传递到另一个视图的类似帖子,它们都使用 frame.navigate(typeof(page),parameter)。但是我的参数不在主页中,我有导航控件。

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;
            }
        }
    }
}
}

第 1.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>

第 1 页.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 事件将数据传递到主页,以便我可以在一个地方提供所有日期。使用主页中的所有数据,我可以将其传递给调用的其他页面。

Xeorge是对的。一般而言,可以将数据保存在单独的数据层中,每个 VM 都可以访问此数据层以获取所需的内容。这实际上是您的最佳实践。

为了更清楚地说明这一点,请查看官方文档:数据绑定和 MVVM有关示例的更多信息,您可以从上面的文档中看到以下内容:"有关使用基本的现成 MVVM 的其他指导,请查看 GitHub 上的客户订单数据库示例。许多其他 UWP 应用示例也使用基本的 MVVM 体系结构,流量应用示例包括代码隐藏和 MVVM 版本,并附有描述 MVVM 转换的说明。

最新更新