Search code examples
wpfreplacetextblockcontentpresenterdatagridcell

WPF DataGridCell Template with TextBlock - Binding?


i replace the ContentPresenter in the DataGridCell's Template with a TextBlock an now i search for the correct Binding to the content.

The normal way is Text="{TemplateBinding Content} for the TextBlock - it doesn't work. Also Text="{Binding RelativeSource={RelativeSource TemplatedParent},Path=Content, Mode=TwoWay}" doesn't work correct.

Any other ideas?


Solution

  • Suppose you have changed the DataGridCell Template to the following

    <ControlTemplate TargetType="{x:Type DataGridCell}">
        <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
            <TextBlock Text="{Binding}"/>
            <!--<ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> -->
        </Border>
    </ControlTemplate>
    

    Since you removed the ContentPresenter, the DataGridCell has no way of displaying its Content. It's still there though. The DataGridCell.Content is a TextBlock containing your original Text and the TextBlock in the Template is another.

    So you'll get the correct Text by binding it to the Content.Text property of the TemplatedParent

    <TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent},
                              Path=Content.Text}"/>
    

    So, to sum it up. This works

    <ControlTemplate TargetType="{x:Type DataGridCell}">
        <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
            <TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, 
                                      Path=Content.Text}"/>
        </Border>
    </ControlTemplate>