wpf - Accessing a control within a control template in C# -


wpf newbie here. trying build table reuse each day of week. moved control template. here xaml:

<controltemplate x:key="defaultgriddesign" >             <grid horizontalalignment="center" margin="0,5">                 <grid.columndefinitions>                     <columndefinition width="80"/>                     <columndefinition width="80"/>                     <columndefinition width="200"/>                     <columndefinition width="60"/>                     <columndefinition width="60"/>                     <columndefinition width="60"/>                     <columndefinition width="60"/>                     <columndefinition width="60"/>                     <columndefinition width="60"/>                     <columndefinition width="60"/>                     <columndefinition width="60"/>                     <columndefinition width="200"/>                     <columndefinition width="200"/>                 </grid.columndefinitions>                 <grid.rowdefinitions>                     <rowdefinition height="30"/>                     <rowdefinition height="60"/>                     <rowdefinition height="60"/>                 </grid.rowdefinitions>                  <label x:name="lbldayofweek" style="{staticresource basiclabelleft}" grid.row="0" grid.column="0" grid.rowspan="3" content="monday"/>                 <label x:name="lblempty" style="{staticresource basiclabelleft}" grid.row="0" grid.column="1"/>                 <label x:name="lblplanned" style="{staticresource basiclabelleft}" content="planned" grid.row="1" grid.column="1"/>                 <label x:name="lblproduced" style="{staticresource basiclabelleft}"  content="produced" grid.row="2" grid.column="1"/>                 <label x:name="lblprevshift" style="{staticresource basiclabelcenter}" content="previous shift" grid.row="0" grid.column="2" />                 <label x:name="lblplannedprevshift" style="{staticresource basiclabelleft}" content="n/a" grid.row="1" grid.column="2" />                 <label x:name="lblproducedprevshift" style="{staticresource basiclabelleft}"  content="n/a" grid.row="2" grid.column="2" />                 <label x:name="lbl1sthr" style="{staticresource basiclabelcenter}" content="01" grid.row="0" grid.column="3" />                 <label x:name="lbl2ndhr" style="{staticresource basiclabelcenter}" content="02" grid.row="0" grid.column="4" />                 <label x:name="lbl3rdhr" style="{staticresource basiclabelcenter}" content="03" grid.row="0" grid.column="5" />                 <label x:name="lbl4thhr" style="{staticresource basiclabelcenter}" content="04" grid.row="0" grid.column="6" />                 <label x:name="lbl5thhr" style="{staticresource basiclabelcenter}" content="05" grid.row="0" grid.column="7" />                 <label x:name="lbl6thhr" style="{staticresource basiclabelcenter}" content="06" grid.row="0" grid.column="8" />                 <label x:name="lbl7thhr" style="{staticresource basiclabelcenter}" content="07" grid.row="0" grid.column="9" />                 <label x:name="lbl8thhr" style="{staticresource basiclabelcenter}" content="08" grid.row="0" grid.column="10"/>                 <label x:name="lbltotal" style="{staticresource basiclabelcenter}" content="total" grid.row="0" grid.column="11"/>                 <label x:name="lblnextshift" style="{staticresource basiclabelcenter}" content="next shift" grid.row="0" grid.column="12"/>                 <label x:name="lblplannedtotal" style="{staticresource basiclabelleft}" content="n/a" grid.row="1" grid.column="11"/>                 <label x:name="lblplannednextshift" style="{staticresource basiclabelleft}" content="n/a" grid.row="1" grid.column="12"/>                 <label x:name="lblproducedtotal" style="{staticresource basiclabelleft}" content="n/a" grid.row="2" grid.column="11"/>                 <label x:name="lblshiftoee" style="{staticresource basiclabelleft}" content="n/a" grid.row="2" grid.column="12"/>                 <stackpanel x:name="stkpnlplanned" grid.row="1" grid.column="3" grid.columnspan="8" width="480"/>                 <stackpanel x:name="stkpnlproduced" grid.row="2" grid.column="3" grid.columnspan="8" width="480"/>             </grid>         </controltemplate> 

this how instantiate them:

<stackpanel>         <contentcontrol template="{staticresource defaultgriddesign}" x:name="cctuesday"></contentcontrol>         <contentcontrol template="{staticresource defaultgriddesign}" x:name="ccwednesday" />         <contentcontrol template="{staticresource defaultgriddesign}" x:name="ccthursday" />         <contentcontrol template="{staticresource defaultgriddesign}" x:name="ccfriday" />         <contentcontrol template="{staticresource defaultgriddesign}" x:name="ccsaturday" />         <contentcontrol template="{staticresource defaultgriddesign}" x:name="ccmonday" />     </stackpanel> 

now hit brick wall, when want bind labels inside controltemplate. every example binding i've found on net uses basic example, , haven't managed find 1 goes on kind of situation. want set hours in top row , day in first column, need fill stack panels labels depending on read excel file. , expect binding/filling of stack panels whole other ballpark. each of tables gets different information. each hour, need update each of them.

i've tried no avail:

label test = (label) this.cctuesday.template.findname("lbldayofweek", cctuesday); 

but result null.

and have been looking @ discussion on here: https://codereview.stackexchange.com/questions/44760/is-there-a-better-way-to-get-a-child

but seems lot of overhead in order access 1 label.

again, newbie, don't know if doing correctly. perhaps there better , more elegant way this. suggestions welcome.

edit 1:
answer below works, when try implement viewmodel class between view , model, in link http://www.codeproject.com/articles/819294/wpf-mvvm-step-by-step-basics-to-advance-level#level3:-addingactionsand“inotifypropertychanged”interface

the labels go being empty.

the view class:

public partial class mainwindow : window     {         private tableviewmodel tableviewmodelmonday = null;         private tableviewmodel tableviewmodeltuesday = null;          public mainwindow()         {             initializecomponent();             try             {                 this.tableviewmodelmonday = new tableviewmodel("monday");                 this.tableviewmodeltuesday = new tableviewmodel("tuesday");             }             catch (exception ex)             {                 messagebox.show(ex.message);             }         }          private void cctuesday_loaded(object sender, routedeventargs e)         {             this.cctuesday.datacontext = this.tableviewmodeltuesday;         }          private void ccmonday_loaded(object sender, routedeventargs e)         {             this.ccmonday.datacontext = this.tableviewmodelmonday;         } 

the app.xaml binding is:

<label x:name="lbldayofweek" style="{staticresource basiclabelleft}" grid.row="0" grid.column="0" grid.rowspan="3" content="{binding dayofweek}"/> 

the viewmodel class:

public class tableviewmodel : inotifypropertychanged     {         private tablemodel tablemodel = null;          public tableviewmodel(string day)         {             tablemodel = new tablemodel(day);         }          public string lbldayofweek         {                         {                 return tablemodel.dayofweek;             }             set             {                 if (tablemodel.dayofweek != value)                 {                     tablemodel.dayofweek = value;                     this.onnotifypropertychanged("dayofweek");                 }             }         }          private void onnotifypropertychanged(string msg)         {             if (this.propertychanged != null)             {                 this.propertychanged(this, new propertychangedeventargs(msg));             }         }          public event propertychangedeventhandler propertychanged;      } 

and model class:

public class tablemodel     {         private string _dayofweek;          public string dayofweek         {                         {                 return this._dayofweek;             }             set             {                 if (this._dayofweek != value)                 {                     this._dayofweek = value;                 }             }         }          public tablemodel(string day)         {             this._dayofweek = day;         }     } 

what missing?

you can achieve reusability usercontrol too. in either ways, binding functionality, can define model type , assign datacontext property of contentcontrol (or usercontrol).

first, bind label inside contenttemplate:

<label x:name="lbldayofweek"        style="{staticresource basiclabelleft}"        grid.row="0"        grid.column="0"        grid.rowspan="3"        content="{binding dayofweek}"/> 

then define model class:

public class model : inotifypropertychanged {     private dayofweek dayofweek;     public dayofweek dayofweek {         {             return this.dayofweek;         }         set {             if (this.dayofweek != value) {                 this.dayofweek = value;                 this.onnotifypropertychanged("dayofweek");             }         }     }     private void onnotifypropertychanged(string name) {         if (this.propertychanged != null) {             this.propertychanged(this, new propertychangedeventargs(name));         }     }     public event propertychangedeventhandler propertychanged; } 

then need create instance of model , assign datacontext:

public partial class mainwindow : window {     private modelclass model = new modelclass();     public mainwindow() {         initializecomponent();         this.customusercontrol.datacontext = this.model;     }      private void button_click(object sender, routedeventargs e) {         this.model.dayofweek = dayofweek.sunday;     } } 

now, whenever change dayofweek property of model object, bound label in contenttemplate gets updated.

and adding items stackpanel dynamically, can consider using itemscontrol class.

just let know, mvvm pattern common design pattern used design wpf applications. following pattern allow use powerful wpf features binding better.


Comments

Popular posts from this blog

shopping cart - Page redirect not working PHP -

php - How to modify a menu to show sub-menus -

python - Installing PyDev in eclipse is failed -