c# - WPF Binding between pages / Transfer data between view models -


i need transfer data between pages , "binding" on it. on first page have textbox bound "username" property. every page has own viewmodel, after clicking button in first page i've done

secondpageviewmodel.username = this.username; 

in second page have textblock bound username property, after page changes, second page show no text.

<textblock text="{binding username}" /> 

the way found , works in second page viewmodel in constructor make task updates username.

task.run(async () =>  {     while(true)     {         await task.delay(200);         this.username = firstpageviewmodel.username;     } }); 

is there other way that? making task here, isn't working, if change page fast, won't show username anyway.

every viewmodel implements inotifypropertychanged + fodyweaver.

following comment, here's simple implementations using events.

  • a first implementation firstpageviewmodel parent of secondpageviewmodel. can see event subscription in secondpageviewmodel constructor.
  • a second implementation firstpageviewmodel on same level of secondpageviewmodel. uses mediator between 2 viewmodels. removing dependency of firstpageviewmodel secondpageviewmodel
  • a third 1 create own delegate on firstpageviewmodel secondpageviewmodel subscribe on. it's same thing propertychanged, can configure event arguments ready pass.

here's demo:

public delegate void usernamechangedeventhandler(string username);  public class firstpageviewmodel : inotifypropertychanged {     // 3) third implementation     public event usernamechangedeventhandler usernamechanged;      private string _username;     public string username     {         { return _username; }         set         {             _username = value;              if (propertychanged != null)                 propertychanged(this, new propertychangedeventargs("username"));              if (usernamechanged != null)                 usernamechanged(this.username);         }     }      public event propertychangedeventhandler propertychanged; }  public class secondpageviewmodel : inotifypropertychanged {      private string _username;     public string username     {         { return _username; }         set         {             _username = value;              if (propertychanged != null)                 propertychanged(this, new propertychangedeventargs("username"));         }     }      public secondpageviewmodel()     {     }      public secondpageviewmodel(firstpageviewmodel parent)     {         // 1) first implementation         parent.propertychanged += firstpageviewmodel_onpropertychanged;          // 3) third implementation         parent.usernamechanged += parent_usernamechanged;     }      private void parent_usernamechanged(string username)     {         this.username = username;     }      private void firstpageviewmodel_onpropertychanged(object sender, propertychangedeventargs args)     {         firstpageviewmodel parent = (firstpageviewmodel) sender;         if(args.propertyname.equals("username", stringcomparison.invariantcultureignorecase))         {             this.username = parent.username;         }     }      public event propertychangedeventhandler propertychanged; }  public class parentviewmodel : inotifypropertychanged {     public event propertychangedeventhandler propertychanged;      private firstpageviewmodel _firstpageviewmodel;     private secondpageviewmodel _secondpageviewmodel;      public parentviewmodel()     {         // 2) second implementation         _firstpageviewmodel = new firstpageviewmodel();         _secondpageviewmodel = new secondpageviewmodel();          _firstpageviewmodel.propertychanged += firstpageviewmodel_propertychanged;           // 3) third implementation         _firstpageviewmodel.usernamechanged += firstpageviewmodel_usernamechanged;     }      private void firstpageviewmodel_usernamechanged(string username)     {         _secondpageviewmodel.username = username;     }      private void firstpageviewmodel_propertychanged(object sender, propertychangedeventargs args)     {         firstpageviewmodel firstpageviewmodel = (firstpageviewmodel)sender;         if (args.propertyname.equals("username", stringcomparison.invariantcultureignorecase))         {             _secondpageviewmodel.username = firstpageviewmodel.username;         }     } } 

Comments

Popular posts from this blog

python - Selenium remoteWebDriver (& SauceLabs) Firefox moseMoveTo action exception -

html - How to custom Bootstrap grid height? -

transpose - Maple isnt executing function but prints function term -