c# - Update dynamic column in datagrid -


i'm working day on this, i'm stuck , don't have solution. seems pretty simple..

i have datagrid dynamic amount of columns. each column has datagridtemplatecolumn celltemplate , celleditingtemplate. celleditingtemplate contains combobox values after user has selected value, textbox in celltemplate has updated selected value. bind known property in object, since don't know how many columns user needs in advance, have create these properties (or else) @ runtime , try bind textbox , combobox property. how solve this? prefer not use expandoobjects , i'm bounded .net 4.0

my solution (which didn't work yet) add wrapperobject list/array in each row object , generate new datagridtemplatecolumn in code combobox , textbox have databindings wrapperobject in array. in xaml , can't 0 changed 1,2,3,... in code behind, don't know how bind wrapperobjectlist[x].value?

here simplified example, helping understanding i'd achieve:

i have datagrid binded observablecollection rowobjects [rowobject represents 1 row.. ;) ]. first column fixed, it's binded property in rowobject.

now have add dynamic amount of columns after this. based on how many items user has selected (not in example, you'll point). replaced action clicking button.

for each column create wrapperobject , add observablecollection within rowobject. gives me bit of flexibility since don't know in advance how many columns added. wrapperobject contains value need display.

furthermore, need wrapperobject binded selection in combobox. if edit row, select value combobox , selected value has displayed (set) in textbox of celltemplate.

example code:

code behind:

public partial class mainwindow : window {     public mainwindow()     {         initializecomponent();         loaddata();           this.datacontext = rowlist;      }      private void loaddata()     {         rowlist = new observablecollection<rowobject>();         wrapperobject lwrapperobject1 = new wrapperobject();         lwrapperobject1.value = 1;         wrapperobject lwrapperobject2 = new wrapperobject();         lwrapperobject2.value = 2;          wrapperobject lwrapperobject3 = new wrapperobject();         lwrapperobject3.value = 3;         wrapperobject lwrapperobject4 = new wrapperobject();         lwrapperobject4.value = 4;          wrapperobject lwrapperobject6 = new wrapperobject();         lwrapperobject6.value = 6;         wrapperobject lwrapperobject8 = new wrapperobject();         lwrapperobject6.value = 8;          rowobject lrowobject1 = new rowobject();         lrowobject1.rowobjectname = "rowobject1";         lrowobject1.wrappercollection.add(lwrapperobject1);         lrowobject1.wrappercollection.add(lwrapperobject2);         lrowobject1.wrappercollection.add(lwrapperobject6);          rowobject lrowobject2 = new rowobject();         lrowobject2.rowobjectname = "rowobject2";         lrowobject2.wrappercollection.add(lwrapperobject3);         lrowobject2.wrappercollection.add(lwrapperobject4);         lrowobject2.wrappercollection.add(lwrapperobject8);          rowlist.add(lrowobject1);         rowlist.add(lrowobject2);       }      public observablecollection<rowobject> rowlist { get; set; }       private void button_click(object sender, routedeventargs e)     {         datagridtemplatecolumn ltemplatecolumn = new datagridtemplatecolumn();         ltemplatecolumn.header = "newdynamiccolumn";         var lmycelltemplate= (datatemplate)resources["mycelltemplate"];         var lmycelleditingtemplate = (datatemplate)resources["mycelleditingtemplate"];          // text="{binding wrappercollection[1].value}" ????          ltemplatecolumn.celltemplate =lmycelltemplate;         ltemplatecolumn.celleditingtemplate = lmycelleditingtemplate;         this.mygrid.columns.add(ltemplatecolumn);     } }  public class rowobject : inotifypropertychanged {      public rowobject()     {         wrappercollection = new observablecollection<wrapperobject>();         comboboxlist = new list<string>();         comboboxlist.add("10");         comboboxlist.add("20");      }      public observablecollection<wrapperobject> wrappercollection { get; set; }      private string frowobjectname;      public string rowobjectname     {         { return frowobjectname; }         set         {             frowobjectname = value;             raisepropertychanged("rowobjectname");         }     }      public list<string> comboboxlist { get; set; }      #region notify property changed     public event propertychangedeventhandler propertychanged;     public void raisepropertychanged(string propertyname)     {         if (propertychanged != null)         {             propertychanged(this, new propertychangedeventargs(propertyname));         }     }     #endregion  }  public class wrapperobject : inotifypropertychanged {     private int fvalue;      public int value      {          {return fvalue;}         set         {             fvalue = value;             raisepropertychanged("value");         }     }      #region notify property changed     public event propertychangedeventhandler propertychanged;     public void raisepropertychanged(string propertyname)     {         if (propertychanged != null)         {             propertychanged(this, new propertychangedeventargs(propertyname));         }     }     #endregion } 

xaml:

<window.resources>     <datatemplate x:key="mycelltemplate">         <textblock text="{binding wrappercollection[1].value}" />     </datatemplate>      <datatemplate x:key="mycelleditingtemplate">         <combobox itemssource="{binding comboboxlist}" />     </datatemplate> </window.resources>  <stackpanel>     <datagrid   x:name="mygrid"                  autogeneratecolumns="false"                 itemssource="{binding}"                 >         <datagrid.columns>             <datagridtextcolumn header="name" binding="{binding rowobjectname}"/>             <datagridtextcolumn header="examplecolumn1" binding="{binding wrappercollection[0].value}"/>             <datagridtemplatecolumn header="examplecolumn2" celltemplate="{staticresource mycelltemplate}" celleditingtemplate="{staticresource mycelleditingtemplate}"/>                    </datagrid.columns>     </datagrid>     <button content="click" click="button_click" width="100" margin="20"/> </stackpanel> 

examplecolumn1 , examplecolumn2 editable columns in example , once click button, added column(s) editable. right think solution creating new binding wrappercollection[2].value, wrappercollection[3].value etc. in code behind, how?

the xamlreader saved me! can create datatemplate i'd have..

    public datatemplate createdatatemplate(type type, int anumber)     {         stringreader stringreader = new stringreader(         @"<datatemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"">          <" + type.name + @" text=""{binding wrappercollection[" + anumber.tostring() + @"].value}""/>      </datatemplate>");         xmlreader xmlreader = xmlreader.create(stringreader);         return xamlreader.load(xmlreader) datatemplate;     }  {     ...     textblock textblock = new textblock();     var lmycelltemplate = createdatatemplate(textblock.gettype(), counter); } 

Comments

Popular posts from this blog

How to remove text and logo OR add Overflow on Android ActionBar using AppCompat on API 8? -

html - How to style widget with post count different than without post count -

url rewriting - How to redirect a http POST with urlrewritefilter -