Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

connect View to ViewModel with DataTemplate

Tags:

combobox

wpf

xaml

I'm trying to understand. When I'm connecting View to ViewModel like this:

    <DataTemplate DataType="{x:Type local:MyViewModel}">
        <local:MyView />
    </DataTemplate>

What does it mean?

It looks like the View is set to be the DataTemplate of the ViewModel. BUT the ViewModel doesn't have a Property of DataTemplate. So what exactly is going on in there?

A demonstration of the question - How do I do that by code (Connecting the View and ViewModel this specific way. I can't write ViewModel.DataTemplate = View)?

Thank you.

like image 453
Programmer Avatar asked Sep 11 '13 06:09

Programmer


2 Answers

It means "To whatever control whose Content data is MyViewModel place MyView there". You are not setting DataTemplate of viewmodel (That does not mean anything) you are setting the DataTemplate for the control whose Data is MyViewModel.

like image 110
Nitin Avatar answered Oct 31 '22 13:10

Nitin


The way how it works is very simple. Your definition of DataTemplate is something like a definition of how a data will look like. In your example the data that you want to represent visually are of type:

DataType="{x:Type local:MyViewModel}"

By defining DataTemplate in control, window or other resources, e.g.

<UserControl.Resources> ...your template... <UserControl.Resources>,

you say "Hey, I want that all my data of type local:MyViewModel will look like this...". Inside the template you define a root control, that will be put in all places where your local:MyViewModel have been used. Normally when you place local:MyViewModel in Grid, ContentControl or other containers, you will see its string representation like "xxxx.xxxxx.MyViewModel" instead of visual.

To to see a graphical representation you must define a DataTemplate. It will replace the string "xxxx.xxxxx.MyViewModel" - representing your data and put there a visual control you defined in the template. Then when it is done, this representation - control from your DataTemplate will get DataContext property set to your View Model, here it will be local:MyViewModel instance.

That will give you a possibility to use binding in your DataTemplate, to bind in you DataTemplate directly to properties from you ViewModel.

Is that more clear now?

like image 36
BrightShadow Avatar answered Oct 31 '22 12:10

BrightShadow