I have a custom DataGrid
(I extended it and included a DependencyProperty
Label
), I am using the DataGrid
and wanted to add Label
control using ControlTemplate
and ContentPresenter
. In the ContentTemplate
the DependencyProperty
Label
works and displays as it should, but the ContentPresenter
doesn't work or display any of the DataGrid
control at all. I tried it with ItemsPresenter
and it shows the rows, I was wondering if there is a way to display the DataGrid
using ContentPresenter
in this manner? what's the right approach to doing this?
MyUserControl.xaml
<UserControl
x:Class="MyNamespace.UI.MyUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:e="clr-namespace:MyNamespace.UI"
mc:Ignorable="d"
d:DesignHeight="350" d:DesignWidth="400">
<UserControl.Resources>
<Style TargetType="{x:Type e:DataGrid}" BasedOn="{StaticResource {x:Type DataGrid}}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type e:DataGrid}">
<StackPanel>
<Label Content="{Binding Label, RelativeSource={RelativeSource TemplatedParent}}" ContentStringFormat="{}{0}: " />
<ContentPresenter Margin="2" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
<WrapPanel x:Name="LayoutRoot" Width="900" HorizontalAlignment="Stretch" Margin="12" VerticalAlignment="Stretch">
<e:DataGrid Label="My Label 1" ItemsSource="{Binding Source={StaticResource MySource1}}"/>
<e:DataGrid Label="My Label 2" ItemsSource="{Binding Source={StaticResource MySource2}}"/>
</WrapPanel>
</UserControl>
DataGrid.cs
namespace MyNamespace.UI
{
public class DataGrid : System.Windows.Controls.DataGrid
{
public string Label
{
get { return (string)GetValue(LabelProperty); }
set { SetValue(LabelProperty, value); }
}
public static readonly DependencyProperty LabelProperty =
DependencyProperty.Register("Label", typeof(string), typeof(DataGrid), new UIPropertyMetadata(""));
public DataGrid()
{}
}
}
The
ControlTemplate
defines the appearance of the entire control. So you can't simply put a<ContentPresenter />
in your template and expect aDataGrid
to show up. Also, you cannot inherit only part of aControlTemplate
:WPF: Is there a way to override part of a ControlTemplate without redefining the whole style?
You could copy the entire default template and add your
Label
to it though: