简体   繁体   中英

How to share data from one view to another?

I have some problems with simple variable sharing between different views.

I have first main view called MainPage.xaml and second called Page2.xaml .

I want to check which radiobutton on MainPage.xaml is checked and send a variable with that date to Page2.xaml .

MainPage:

namespace IDG
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class MainPage : Page
    {


        public string choice;

        public MainPage()
        {
            this.InitializeComponent();

        }

        private void bt_start_Click(object sender, RoutedEventArgs e)
        {

            if (rb_choice1.IsChecked == true)
            {
                choice = "choice1";

            }

            if (rb_quiz.IsChecked == true)
            {
                this.Frame.Navigate(typeof(Page2), choice);

            }

        }
    }
}    

And Page2:

namespace IDG
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class Page2 : Page
    {

        private string x;

        public Page2()
        {
            this.InitializeComponent();

        }



        protected override void OnNavigatedTo(NavigationEventArgs e)
       {
            var param = e.Parameter as string;
            x = param;
            textBlock1.Text = x;
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            this.Frame.Navigate(typeof(MainPage));
        }
    }
}

And I want this parameter to be stored in main class, how to do it?

On Page 2 in the OnNavigatedTo event retreive the value like this: var param = e.Parameter as string

EDIT

Assign the retreived parameter to the textblock in the OnNavigatedTo. At the time the page is constructed the value of x is "".

public sealed partial class Page2 : Page
{

    private string x="";

    public Page2()
    {
        this.InitializeComponent();
    }



    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        x = e.Parameter as string;
        textBlock1.Text = x;
    }

    private void button_Click(object sender, RoutedEventArgs e)
    {
        this.Frame.Navigate(typeof(MainPage));
    }
}

Recently, I'm working on WPF project but we use it with DevExpress library, and for your issue, it's very easy to be fixed with Messenger in DevExpress.

We just register the messenger where you want to receive the data,

public class Message {
    //... 
}
public class Recipient {
    public Recipient() {
        Messenger.Default.Register<string>(this, OnMessage1);
        Messenger.Default.Register<Message>(this, OnMessage2);
    }
    void SendMessages() {
        Messenger.Default.Send("test");
        Messenger.Default.Send(new Message());
    }
    void OnMessage1(string message) {
        //... 
    }
    void OnMessage2(Message message) {
        //... 
    }
} 

And then you can send it from another view,

public class InheritedMessage : Message {
    //... 
}
public class Recipient {
    public Recipient() {
        //Inherited messages are not processed with this subscription 
        Messenger.Default.Register<Message>(
            recipient: this, 
            action: OnMessage);
        //Inherited messages are processed with this subscription 
        Messenger.Default.Register<Message>(
            recipient: this, 
            receiveInheritedMessagesToo: true,
            action: OnMessage);
    }
    void SendMessages() {
        Messenger.Default.Send(new Message());
        Messenger.Default.Send(new InheritedMessage());
    }
    void OnMessage(Message message) {
        //... 
    }
}

With it, you can pass data between modules (or views, but recommend to use MVVM) If you want to know more about DevExpress, please go through https://documentation.devexpress.com/#WPF/CustomDocument17474

Hope it could help you. :)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM