iphone - How to listen DataContext change to adjust UI state accordingly -
this question taking roots discussion inside https://github.com/slodge/mvvmcross/issues/367 thread.
if we're following recent examples of setting bindings mvvmcross framework setup bindings control properties (like uilabel.text) using bind(), to() extensions:
this.delaybind(() => { var set = this.createbindingset<kittencollectioncell, kitten>(); set.bind(namelabel).to(kitten => kitten.name); set.bind(pricelabel).to(kitten => kitten.price); set.bind(_loader).to(kitten => kitten.imageurl); set.apply(); });
but if want adjust ui state basing on values datacontext. example show/hide buttons , labels , adjust constraint values.
if (((userinfo)datacontext).isadmin) { savebutton.hidden = false; securitylabelconstraint.constant = 50; /* etc */ }
how can listen datacontext change event? what's recommended approach here?
thanks.
there several way achieve this.
one of simplest way you've identified - e.g. bind securitylabelconstraint directly - e.g. using tibet
binding:
set.bind(securitylabelconstraint) .for(p => p.constant) .to("if(info.isadmin, 20, 0)");
alternatively if there complicated logic needed (beyond scope or performance of tibet binding engine) can implement binding property on cell - or on intermediate object.
for example, have wrapper class implements:
public class wrapper { private nslayoutconstraint _constraint; public wrapper(nslayoutconstraint constraint) { _constraint = constraint; } private string _foo; public string foo { { return _foo; } set { _foo = value; // complex logic on _constraint goes here } } }
if store _wrapper
instance in field on cell, can bound as:
set.bind(_wrapper) .for(p => p.foo) .to(info => info.isadmin);
if had instead put foo property on cell, have used:
set.bind() .for(cell => cell.foo) .to(info => info.isadmin);
one final way achieve binding try hook cell's datacontext
directly , use propertychanged
handler - don't recommend tends bit fiddly maintain , it's easy create memory leaks when accessing nsobject's inside event callbacks.
Comments
Post a Comment