Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9743

DataGridでAutoGenerateColumnsが有効なままで、フォーマットをカスタムする

$
0
0

概要

DataGridでデフォルトのフォーマット以外にしたいことがあります。しかしフォーマットを変えるためだけに、AutoGenerateColumnsを無効にして全ての列を自分で定義するのは面倒です。
1つの解決方法はDataGridのAutoGeneratingColumnイベントでフォーマットを指定することです。
しかしできればコードビハインドを書きたくないし、複数のDataGridで流用したい、そういう時は添付プロパティが使えます。

image.png

添付プロパティ

DateTime用のDateTimeFormatAutoGenerateTimeSpan用のTimeSpanFormatAutoGenerateの2つのフォーマットを指定できる添付プロパティが定義されています。

classDataGridOperation{publicstaticstringGetDateTimeFormatAutoGenerate(DependencyObjectobj)=>(string)obj.GetValue(DateTimeFormatAutoGenerateProperty);publicstaticvoidSetDateTimeFormatAutoGenerate(DependencyObjectobj,stringvalue)=>obj.SetValue(DateTimeFormatAutoGenerateProperty,value);publicstaticreadonlyDependencyPropertyDateTimeFormatAutoGenerateProperty=DependencyProperty.RegisterAttached("DateTimeFormatAutoGenerate",typeof(string),typeof(DataGridOperation),newPropertyMetadata(null,(d,e)=>AddEventHandlerOnGenerating<DateTime>(d,e)));publicstaticstringGetTimeSpanFormatAutoGenerate(DependencyObjectobj)=>(string)obj.GetValue(TimeSpanFormatAutoGenerateProperty);publicstaticvoidSetTimeSpanFormatAutoGenerate(DependencyObjectobj,stringvalue)=>obj.SetValue(TimeSpanFormatAutoGenerateProperty,value);publicstaticreadonlyDependencyPropertyTimeSpanFormatAutoGenerateProperty=DependencyProperty.RegisterAttached("TimeSpanFormatAutoGenerate",typeof(string),typeof(DataGridOperation),newPropertyMetadata(null,(d,e)=>AddEventHandlerOnGenerating<TimeSpan>(d,e)));privatestaticvoidAddEventHandlerOnGenerating<T>(DependencyObjectd,DependencyPropertyChangedEventArgse){if(!(disDataGriddGrid))return;if((e.NewValueisstringformat))dGrid.AutoGeneratingColumn+=(o,e)=>AddFormat_OnGenerating<T>(e,format);}privatestaticvoidAddFormat_OnGenerating<T>(DataGridAutoGeneratingColumnEventArgse,stringformat){if(e.PropertyType==typeof(T))(e.ColumnasDataGridTextColumn).Binding.StringFormat=format;}}

使用方法

XAML上でフォーマットを指定します。
DataGridOperation.DateTimeFormatAutoGenerate="yy年MM月dd日"

コードビハインドは使用していません。

MainWindow.xaml
<Windowx:Class="DataGridAutogenerateCustom.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:DataGridAutogenerateCustom"Width="400"Height="250"><Window.DataContext><local:MainWindowViewModel/></Window.DataContext><StackPanel><TextBlockText="DEFAULT FORMAT"/><DataGridItemsSource="{Binding Dates}"/><TextBlockMargin="0,30,0,0"Text="CUSTOM FORMAT"/><DataGridlocal:DataGridOperation.DateTimeFormatAutoGenerate="yy年MM月dd日"local:DataGridOperation.TimeSpanFormatAutoGenerate="dd\日hh\時mm\分ss\秒"ItemsSource="{Binding Dates}"/></StackPanel></Window>

ViewModelは以下のようになります。

MainWindowViewModel.cs
publicclassMainWindowViewModel{publicDatePairs[]Dates{get;}=newDatePairs[]{new(){StartDate=new(2011,1,1),EndDate=new(2011,2,1)},new(){StartDate=new(2020,1,1),EndDate=new(2021,1,1)},};}publicclassDatePairs{publicDateTimeStartDate{get;set;}publicDateTimeEndDate{get;set;}publicTimeSpanSpan=>EndDate-StartDate;}

環境

VisualStudio 2019 Version 16.8.4
.NET 5
C#9

参考

https://stackoverflow.com/questions/7978249/date-formatting-in-wpf-datagrid


Viewing all articles
Browse latest Browse all 9743

Trending Articles