DataGrid for WPF/Silverlight
列セルコンテンツのカスタマイズ
製品の概要 > DataGrid の機能 > カスタム列 > 列セルコンテンツのカスタマイズ

このセクションでは、列に含まれるセルが編集モードになっていないときに、セルコンテンツとして表示される UI 要素を変更する方法について説明します。

セルコンテンツの UI 要素はデータグリッドによって再利用されることに注意してください。つまり、この列で使用されている UI 要素は、他の列によって作成された可能性があります。

カスタムのセルコンテンツを実装するには、以下のメソッドをオーバーライドする必要があります。

ハイパーリンク列の実装では、メソッドは次の例のようになります。次のメソッドでは、この列に対して別のキーが返されます(デフォルトキーは typeof(TextBlock))。これは、この列が他の列とセルコンテンツの要素を共有しないことを意味します。別の列が同じキーを返す場合は例外ですが、そのようなことはほとんど起こりません。

コードのコピー
Public Overloads Overrides Function GetCellContentRecyclingKey(ByVal row As DataGridRow) As Object
    Return (GetType(HyperlinkButton))
End Function
コードのコピー
public override object GetCellContentRecyclingKey(DataGridRow row)
{
    return typeof(HyperlinkButton);
}

CreateCellContent メソッドは、再利用されるハイパーリンクがない場合に、データグリッドによって呼び出されます。この場合、ハイパーリンクを含むセルがアンロードされると、そのセルで使用される新しいハイパーリンクが作成されます。作成されたハイパーリンクは、後から他のセルで使用するために保存されます。

コードのコピー
Public Overloads Overrides Function CreateCellContent(ByVal row As DataGridRow) As FrameworkElement
    Return New HyperlinkButton()
End Function
C#
コードのコピー
public override FrameworkElement CreateCellContent(DataGridRow row)
{
   return new HyperlinkButton();
}

ハイパーリンクが作成されるか、再利用されたハイパーリンクが取得されると、データグリッドはパラメータとしてハイパーリンクを渡して BindCellContent メソッドを呼び出します。このメソッドでは、ハイパーリンクのプロパティを設定してセルのデータに連結する必要があります。 

コードのコピー
Public Overloads Overrides Sub BindCellContent(ByVal cellContent As FrameworkElement, ByVal row As DataGridRow)
    Dim hyperlink = DirectCast(cellContent, HyperlinkButton)
    If Binding IsNot Nothing Then
        Dim newBinding As Binding = CopyBinding(Binding)
        newBinding.Source = row.DataItem
        hyperlink.SetBinding(HyperlinkButton.NavigateUriProperty, newBinding)
    End If
    hyperlink.HorizontalAlignment = HorizontalAlignment
    hyperlink.VerticalAlignment = VerticalAlignment
End Sub
コードのコピー
public override void BindCellContent(FrameworkElement cellContent, DataGridRow row)
{
    var hyperlink = (HyperlinkButton)cellContent;
    if (Binding != null)
    {
        Binding newBinding = CopyBinding(Binding);
        newBinding.Source = row.DataItem;
        hyperlink.SetBinding(HyperlinkButton.NavigateUriProperty, newBinding);
    }
    hyperlink.HorizontalAlignment = HorizontalAlignment;
    hyperlink.VerticalAlignment = VerticalAlignment;
}

連結の Source プロパティにデータ項目を設定するのではなく、ハイパーリンクのデータコンテキストとしてデータ項目を設定することもできます。次に例を示します。

コードのコピー
Hyperlink.DataContext = row.DataItem
コードのコピー
Hyperlink.DataContext = row.DataItem;

結果は同じですが、この方法のパフォーマンスは、直接連結ソースのプロパティを設定するより低くなります。