c# - Access a Model class from a View without direct access to Model Layer -
i need create property
in 1 of user controls of model
type think must prevent direct access model layer
view layer
.
i have view model
of model
provide set of model objects...
- setofa_usercontrol
- setofa_viewmodel
- a_model
i need property in user control:
public a_model selecteda { get; set; }
one way create new view model
following codes , use in user control
:
// ------------ view model layer ------------ public class singlea_viewmodel: modela { } // --------------- view layer --------------- public singlea_viewmodel selecteda { get; set; }
but i'm trying prevent new empty view model class inherit model above. correct?
what suggestions prevent direct access model layer
, create property
in user control
???
edit 1:
i have 3 project:
- view project
- view model project
- model project
i want know can prevent reference model project
in view project
or not....
i have selecteda
property in view model , put logic in view model class
, work in view but have selecteda
property in usercontrol
bind selecteda
property in viewmodel
class... need direct access model
in usercontrol
define property!
when have direct access model
view
codes this:
// ------------ model layer ------------ public class amodel { } // ------------ view model layer ------------ public class setofa_viewmodel: inotifypropertychanged { public amodel selecteda { get; set; } public observablecollection<amodel> items { { return _items; } set { _items = value; onpropertychanged("items"); } } // other logic codes fill , keep selecteda value and.... } // --------------- view layer --------------- public partial class myusercontrol : usercontrol { public amodel selecteda { { return (amodel)getvalue(selectedaproperty); } set { var oldvalue = (amodel)getvalue(selectedaproperty); if (oldvalue != value) setvalue(selectedaproperty, value); } } public static readonly dependencyproperty selectedaproperty = dependencyproperty.register( "selecteda", typeof(amodel), typeof(myusercontrol), new propertymetadata(onselectedavaluechanged)); public myusercontrol () { initializecomponent(); const string name_of_property_in_vm = "selecteda"; var binding = new binding(name_of_property_in_vm) { mode = bindingmode.twoway }; this.setbinding(selectedaproperty, binding); } private static void onselectedavaluechanged(dependencyobject o, dependencypropertychangedeventargs e) { //------ } }
the above method work me , use but i'm trying delete direct access , reference model project
in view project
how can implement selecteda
dependency property of amodel
in user control
?
some friends can access model project directly view project. want know correct ways
, not possible ways
...!
edit 2
when keep selecteda item in user control use in window this:
<usercontrols:myusercontrol x:name="myusercontrol1"/> <label content="{binding elementname=myusercontrol1, path=selecteda.title}" />
edit 3
why want prevent direct access model viewmodel?
i searched mvvm diagrams , did not find , direct access view model. diagrams says:
..........
now can direct access model view yet?
why there many samples have direct access model in view on web?
and why people can this?
if can , direct access model correct implement why there not relation between view , model in above diagrams???
a viewmodel not model should not derive.
if decide couple view model, change in model dictated external source, might affect views used in.
when using viewmodel each view views might not affected @ change , affected views can fixed either adjusting view or writing code in viewmodel.
yes, adding layer in between work comes clear point of transitioning view model , again. after couple of increments might worth it.
the layer provides nice point of extension commands , validation , view specific properties.
if decide expose model property of viewmodel can become tempting add properties , commands model view specific. pollute model , make model hard reused or regenerated.
there no law , there no police. take arguments consideration , pick option. try open change design later. appears easy right might become difficult later on. don't know happen; agile/flexible. in experience found applications survive many versions more efficient have clean separation between model , viewmodel short lived apps might much.
when implementing mvvm pattern make sure model doesn't know or assume viewmodel , viewmodel doesn't know or assume view. viewmodel man in middle; knows instances of model , where send changes of model. many times have used 1 or more repositories know how or save model instances viewmodel has know repository. repository can take care or delegate other features such caching across viewmodel instances.
in general create 1 viewmodel per view , assign instance of viewmodel datacontext of view. binding paths (for both properties , commands) relative viewmodel.
sometimes nest viewmodels adding properties main viewmodel viewmodels themselves.
Comments
Post a Comment