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 insecondpageviewmodelconstructor. - a second implementation
firstpageviewmodel on same level of secondpageviewmodel. uses mediator between 2 viewmodels. removing dependency offirstpageviewmodelsecondpageviewmodel - a third 1 create own delegate on
firstpageviewmodelsecondpageviewmodelsubscribe on. it's same thingpropertychanged, 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
Post a Comment