在页面C#WPF之间传递数据

时间:2016-07-08 06:13:54

标签: c# wpf string xaml binding

我试图在页面之间传递一个简单的字符串,但我不知道如何。

我创建了一个测试应用程序,单击一个按钮,“a”的值将传递到下一页(Page1.xaml.cs)

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        string a = "hello";

        Page2 p2 = new Page2();
        NavigationService.Navigate(p2, a);
    }

现在,我想从Page1(Page2.xaml.cs)

中提取数据
    private void NavigationService_LoadCompleted(object sender, NavigationEventArgs e)
    {
        string str = (string)e.ExtraData;
    }

然后在构造函数(Page2.xaml.cs)中订阅

    public Page2()
    {
        InitializeComponent();
        NavigationService.LoadCompleted += NavigationService_LoadCompleted;
    }

然而,当我运行该程序时,我收到一个错误。有人可以指出我错过了什么吗?

3 个答案:

答案 0 :(得分:2)

如果没有好的Minimal, Complete, and Verifiable code example,就无法确定解决问题所需的一切。但是,如果您要问的是如何在导航时允许数据从一个页面传递到下一个页面,那么在我看来NavigationService.Navigate(object, object)重载会对您有用。

第二个参数是您要传递的数据。目标页面可以处理NavigationService.LoadCompleted事件(或您喜欢的任何其他适当的事件),其中可以通过NavigationEventArgs.ExtraData属性检索传递给Navigate()方法的对象值。 / p>

例如,在您的第一页中:

private void button_Click(object sender, RoutedEventArgs e)
{
    Page2 p2 = new Page2();
    NavigationService.Navigate(p2, v.str);
}

然后在你的第二页:

private void NavigationService_LoadCompleted(object sender, NavigationEventArgs e)
{
    string str = (string)e.ExtraData;

    // do whatever with str, like assign to a view model field, etc.
}

当然,您将订阅事件处理程序,例如在您的页面的构造函数或XAML中。例如:

public partial class Page2 : Page
{
    public Page2()
    {
        InitializeComponent();

        NavigationService.LoadCompleted += NavigationService_LoadCompleted;
    }

    private void button_Click(object sender, RoutedEventArgs e)
    {
        NavigationService.GoBack();
    }

    private void NavigationService_LoadCompleted(object sender, NavigationEventArgs e)
    {
        string str = (string)e.ExtraData;

        // do whatever with str, like assign to a view model field, etc.
    }
}

答案 1 :(得分:0)

不是设置文本框DataContext,而是将整个页面的datacontext设置为某个类,即page1的ViewModel。实现接口 INotifyPropertyChanged 并确保在字符串属性的集合中引发 NotifyPropertyChanged(“ElementName”)

现在使用相应的视图模型创建一个新视图,该模型还应实现 INotifyPropertyChanged 接口。创建一个文本框并将其绑定到字符串属性,就像在第一页中一样。确保两个属性的 TwoWay 绑定,以确保在更改数据时更新目标和源。

在MainWindow中创建两个viewModel的实例。当用户导航到第二个用户控件时,请设置

Page2ViewModel.TextBoxString = Page1ViewModel.TextBoxString;

在从Page2导航到Page1时,反之亦然。

Page1ViewModel.TextBoxString = Page2ViewModel.TextBoxString;

这样,两个文本框都将在导航期间更新。 这只是一个总体想法。您需要从一些教程中了解有关MVVM和WPF的更多信息。在谷歌搜索。

答案 2 :(得分:0)

这是我的例子,也许对某人有帮助

在Page1.cs

content_style

在Page2.cs

content_css

Page2具有属性Name =“ exam”,examObj是该Page2类中的全局变量