Variable Date Format for WPF DataGrid in C# -


i have datetime field in list<> used itemsource in wpf datagrid format differently depending on value.

if datetime value within year of datetime.now, want use 'mmm dd hh:mm' formatting, if beyond year of datetime.now, want use 'mmm dd yyyy' formatting, , if datetime.minvalue, wish cell in data grid blank.

this code have currenly shows dates 'mmm dd hh:mm' format.

is possible define variable formatting directly in xaml?

if not, how can patch formatting programatically in datagrid_loaded event?

screenshot of code's output

   public class deadlineitem     {         public string name { get; set; }         public datetime deadline {get; set; }          public deadlineitem(string aname, datetime adeadline)         {             this.name = aname;             this.deadline = adeadline;         }     }      private void datagrid_loaded(object sender, routedeventargs e)     {         var items = new list<deadlineitem>();          items = new list<deadlineitem>();         items.add(new deadlineitem("distant deadline", datetime.now.adddays(500)));         items.add(new deadlineitem("near deadline", datetime.now.adddays(1)));         items.add(new deadlineitem("no deadline", datetime.minvalue));         // ... assign itemssource of datagrid.         var grid = sender datagrid;         grid.itemssource = items;     } 

and xaml is:

<datagrid         autogeneratecolumns="false"         horizontalalignment="left"         margin="0,0,0,0"         verticalalignment="top"         loaded="datagrid_loaded">                 <datagrid.columns>                     <datagridtextcolumn header="name" binding="{binding name}" />                     <datagridtextcolumn header="deadline" binding="{binding deadline, stringformat=\{0:mmm dd hh:mm\}}" />                 </datagrid.columns>             </datagrid> 

as eugene mentioned, you'll want use converter. first, you'll want add class implements ivalueconverter:

public class datetimeformatconverter : ivalueconverter {     public object convert(object value, type targettype, object parameter, cultureinfo culture)     {         var datevalue = value datetime?;          if (datevalue != null)         {             var diff = datevalue - datetime.now;              // greater 1 year, format mm/dd/yyyy             if (diff > new timespan(365, 0, 0, 0))             {                 return datevalue.value.tostring("mmm dd yyyy");             }             else if (datevalue == datetime.minvalue)             {                 return "";             }             else             {                 return datevalue.value.tostring("mmm dd hh:mm");             }         }          return null;     }      public object convertback(object value, type targettype, object parameter, cultureinfo culture)     {         throw new notimplementedexception();     } } 

now, need reference converter in xaml file. like:

<window.resources>     <testwpf:datetimeformatconverter x:key="datetimeformatconverter"></testwpf:datetimeformatconverter> </window.resources> 

lastly, you'll change binding use converter:

<datagrid autogeneratecolumns="false" horizontalalignment="left" margin="0,0,0,0" verticalalignment="top" loaded="datagrid_loaded">     <datagrid.columns>         <datagridtextcolumn header="name" binding="{binding name}" />         <datagridtextcolumn header="deadline" binding="{binding deadline, converter={staticresource datetimeformatconverter}}" />     </datagrid.columns> </datagrid> 

you don't need worry sorting, datagrid sort on underlying date, not formatted string.


Comments

Popular posts from this blog

c++ - Difference between pre and post decrement in recursive function argument -

php - Nothing but 'run(); ' when browsing to my local project, how do I fix this? -

php - How can I echo out this array? -