J'ai une coutume DataGrid
(j'ai étendu et inclus un DependencyProperty
Label
), je me sers du DataGrid
et voulait ajouter Label
contrôle à l'aide ControlTemplate
et ContentPresenter
. Dans le ContentTemplate
le DependencyProperty
Label
fonctionne et affiche comme il se doit, mais le ContentPresenter
ne fonctionne pas ou n'affiche aucun contrôle DataGrid
. Je l'ai essayé avec ItemsPresenter
et il montre les lignes, je me demandais s'il y a un moyen d'afficher le DataGrid
en utilisant ContentPresenter
de cette manière? Quelle est la bonne approche pour le faire?contrôle DataGrid personnalisé avec ControlTemplate et ContentPresenter
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()
{}
}
}
ah c'est ce que je craignais, obtenu ça merci! – Ash