スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: スポンサー広告

DataGridTextColumnで右詰めにしたい時が多々ある。

DataGridColumnには、テキストを表示するためのクラスとして、DatagGridTextColumnがある。
しかし、このクラス、文字寄せを設定できない。メモ的な内容の文字列であれば、左寄せで十分なんだけど、
数値を表示する時は右寄せで表示したくなる。
それらしきものがないか調べたら、ちゃんとあったりする。
WPF Toolkit DataGrid, Part III – Playing with Columns and Cells
ExtendedTextBoxColumnという名前をちょっと変えて実装してみる。

using System;
using System.Windows;
using System.Windows.Controls;

namespace TawamureDays {

/// <summary>
/// DataGridTextColumn拡張クラス<br/>
/// </summary>
public class DataGridTextExColumn : DataGridTextColumn {

#region コンストラクタ

/// <summary>
/// コンストラクタ
/// </summary>
public DataGridTextExColumn() : base() {

}
}
}

これに、文字用の依存関係プロパティを実装する

/// <summary>
/// 水平方向の位置を取得|設定します。
/// </summary>
public HorizontalAlignment HorizontalAlignment {
get {return (HorizontalAlignment)GetValue(HorizontalAlignmentProperty);}
set {SetValue(HorizontalAlignmentProperty, value);}
}

/// <summary>水平方向の位置</summary>
public static readonly DependencyProperty HorizontalAlignmentProperty =
DependencyProperty.Register("HorizontalAlignment", typeof(HorizontalAlignment),
typeof(DataGridTextExColumn),
new UIPropertyMetadata(HorizontalAlignment.Left));

/// <summary>
/// 垂直方向の位置を取得|設定します。
/// </summary>
public VerticalAlignment VerticalAlignment {
get {return (VerticalAlignment)GetValue(VerticalAlignmentProperty);}
set {SetValue(VerticalAlignmentProperty, value);}
}

/// <summary>垂直方向の位置</summary>
public static readonly DependencyProperty VerticalAlignmentProperty =
DependencyProperty.Register("VerticalAlignment", typeof(VerticalAlignment),
typeof(DataGridTextExColumn),
new UIPropertyMetadata(VerticalAlignment.Center));

これで、XAML上からは設定できる事になる。
では、このプロパティをどう反映させるかが次のコードになる。

/// <summary>
/// 列の Binding プロパティ値にバインドされた読み取り専用の TextBlock コントロールを取得します。
/// </summary>
/// <remarks>
/// 値が入る前なので、ここで値の編集とかはできない。
/// </remarks>
/// <param name="cell">生成された要素を格納するセル。</param>
/// <param name="dataItem">目的のセルを格納している行によって表されるデータ項目。</param>
/// <returns>列の Binding プロパティ値にバインドされた新しい読み取り専用のテキスト ブロック コントロール</returns>
protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem) {
var txtBlock = (TextBlock)base.GenerateElement(cell, dataItem);
txtBlock.HorizontalAlignment = this.HorizontalAlignment;
txtBlock.VerticalAlignment = this.VerticalAlignment;
return txtBlock;
}

/// <summary>
/// 列の Binding プロパティ値にバインドされた TextBox コントロールを取得します。
/// </summary>
/// <remarks>
/// 値が入る前なので、ここで値の編集とかはできない。
/// </remarks>
/// <param name="cell">生成された要素を格納するセル。</param>
/// <param name="dataItem">目的のセルを格納している行によって表されるデータ項目。</param>
/// <returns>列の Binding プロパティ値にバインドされた新しい TextBox コントロール</returns>
protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem) {
var textBox = (TextBox)base.GenerateEditingElement(cell, dataItem);

//文字寄せを指定します。
textBox.TextAlignment = this.GetTextAlignment();
textBox.VerticalAlignment = this.VerticalAlignment;
//textBox.MaxLength = this.MaxLength;

return textBox;
}

GenerateElementメソッドは、表示に用いられるTextBlockにアクセスできる。
GenerateEditingElementメソッドは、編集時に用いられるTextBoxにアクセスできる。
これらに実装したプロパティを設定している。
ただし、TextBoxのTextAlignmentにHorizontalAlignmentを直接セットできない。
なので、変換用のメソッドが必要となる。

/// <summary>
/// DataGridColumnに設定されたHorizontalAlignmentプロパティから、
/// TextAlignment(TextBoxの文字寄せ)を取得します。
/// </summary>
/// <returns>TextAlignment</returns>
private TextAlignment GetTextAlignment() {
switch (HorizontalAlignment) {
case HorizontalAlignment.Left:
return TextAlignment.Left;
case HorizontalAlignment.Right:
return TextAlignment.Right;
case HorizontalAlignment.Center:
return TextAlignment.Center;
case HorizontalAlignment.Stretch:
return TextAlignment.Justify;
default:
throw new ArgumentOutOfRangeException("HorizontalAlignment");
}
}

という感じで作った物を早速作ってみる。

<Window x:Class="TawamureDays.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:local="clr-namespace:TawamureDays"
Title="MainWindow" Height="213" Width="385"
local:WindowBehavior.UseMessageCommand="True"
local:FrameworkElementBehavior.OnLoadedCommand="{Binding LoadedCommand}">
<Grid>
<DataGrid AutoGenerateColumns="False"
VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Standard"
CanUserAddRows="False"
CanUserDeleteRows="False"
SelectionMode="Extended"
SelectionUnit="CellOrRowHeader"
ItemsSource="{Binding PersonsList}"
AlternatingRowBackground="AliceBlue">
<DataGrid.Columns>
<DataGridCheckBoxColumn IsReadOnly="False"
local:DataGridExtender.ColumnId="ColIsChecked"
/>
<DataGridTextColumn IsReadOnly="True"
Header="名前"
local:DataGridExtender.ColumnId="ColFirstName"
Binding="{Binding FirstName}"
Width="1*"
/>
<DataGridTextColumn IsReadOnly="True"
Header="苗字"
local:DataGridExtender.ColumnId="ColSecondName"
Binding="{Binding SecondName}"
Width="2*"
/>
<local:DataGridTextExColumn IsReadOnly="True"
Header="年齢"
local:DataGridExtender.ColumnId="ColAge2"
Binding="{Binding Age}"
Width="Auto"
HorizontalAlignment="Right"
/>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>

20120828_1
このクラスに更に、最大文字数(MaxLength)を設定することも可能かな。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。