i ran quite confusing problem when developing multi-window wpf application.
there 2 windows, mainwindow , secondwindow. code of both pretty simple: mainwindow:
<button content="change property 5" click="changeproperty" horizontalalignment="left" margin="10,10,0,0" verticalalignment="top" /> secondwindow:
<label content="{binding instanceofmyclass.value, notifyonsourceupdated=true}"></label> the code behind second window untouched, code behind first window following:
public partial class mainwindow : window { secondwindow w; viewmodel vm; public mainwindow() { initializecomponent(); vm = new viewmodel() { instanceofmyclass = new myclass() { value = 3 } }; w = new secondwindow() { datacontext = vm }; w.show(); } private void changeproperty(object sender, routedeventargs e) { vm.instanceofmyclass.value = 7; } } and view model class implements inotifypropertychanged:
class viewmodel : inotifypropertychanged { private myclass _instance; public myclass instanceofmyclass { { return _instance; } set { _instance = value; onpropertychanged("instanceofmyclass"); } } public event propertychangedeventhandler propertychanged; protected virtual void onpropertychanged(string propertyname) { var handler = propertychanged; if (handler != null) handler(this, new propertychangedeventargs(propertyname)); } } class myclass { public int value { get; set; } } i expected text block change text 5 when click button. number "3" correctly loaded on startup. window refreshes when create new instance of myclass , set instanceofmyclass in viewmodel.
but when hit button - or, stranger, when temporarily store instanceofmyclass, set null , reassign saved variable - nothing happens.
any idea why?
thanks in advance!
implement inotifypropertychanged in myclass , try again. in changeproperty change value property, doesn't notify view change.
or can try rewriting changeproperty following:
vm.instanceofmyclass = new myclass() { value = 7 }; both of these approaches should fix problem far can see.
Comments
Post a Comment