web-dev-qa-db-fra.com

Comment puis-je utiliser une liaison ElementName dans un ControlTemplate?

J'ai plusieurs TextBlocks qui référencent différents éléments dans mon application. Mon code fonctionne bien lorsqu'il est utilisé directement dans la page. Cependant, je veux créer un ControlTemplate et un ContentControl pour réduire la duplication de code.

Comment puis-je transmettre une référence à un ElementName dans le ControlTemplate à partir du ContentControl à l'aide de TemplateBinding? Le code suivant renvoie cette erreur:

"Impossible de convertir la valeur de l'attribut 'ElementName' en objet de type 'System.String'. L'objet de type 'System.Windows.TemplateBindingExpression' ne peut pas être converti en type 'System.String'."

En plus de l'attribut Tag, j'ai essayé ContentStringFormat qui ne fonctionnait pas non plus.

Quelle est la bonne méthode pour que cela fonctionne avec des modèles?

Merci d'avance pour votre aide,

--- Shawn

Voici l'exemple de code:

<Page xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation" xmlns:sys="clr-namespace:System;Assembly=mscorlib" xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml" >
    <Page.Resources>
        <ControlTemplate x:Key="MyTemplate" TargetType="{x:Type ContentControl}">
            <TextBlock Margin="{Binding ElementName={TemplateBinding Tag}, Path=Margin}" Text="{TemplateBinding Content}" TextAlignment="{Binding ElementName={TemplateBinding Tag}, Path=TextAlignment}" Width="{Binding ElementName={TemplateBinding Tag}, Path=Width}" />
        </ControlTemplate>
    </Page.Resources>
    <StackPanel>
        <TextBlock x:Name="AnotherElement" Margin="10" Text="Main TextBlock" TextAlignment="Center" Width="100" />
        <TextBlock x:Name="AnotherElement2" Margin="20" Text="Second TextBlock" TextAlignment="Left" Width="250" />
        <TextBlock Margin="{Binding ElementName=AnotherElement, Path=Margin}" Text="Here is my TextBlock!" TextAlignment="{Binding ElementName=AnotherElement, Path=TextAlignment}" TextTrimming="CharacterEllipsis" Width="{Binding ElementName=AnotherElement, Path=Width}" />
        <TextBlock Margin="{Binding ElementName=AnotherElement2, Path=Margin}" Text="Here is my Second TextBlock!" TextAlignment="{Binding ElementName=AnotherElement2, Path=TextAlignment}" TextTrimming="CharacterEllipsis" Width="{Binding ElementName=AnotherElement2, Path=Width}" />
        <ContentControl Content="Hello!" Tag="AnotherElement" Template="{StaticResource MyTemplate}" />
        <ContentControl Content="Hello Again!" Tag="AnotherElement2" Template="{StaticResource MyTemplate}" />
    </StackPanel>
</Page>
12
Shawn Roser

Cela semble être une façon amusante de modéliser quelque chose, mais cela peut être fait, il vous suffit de faire un peu de fantaisie avec vos liaisons.

Ce qui suit fonctionnera, mais je ne pense toujours pas que ce soit un bon moyen de créer un modèle de contrôle

Lier le TextBlockTag à l'élément réel, puis dans le ControlTemplate lier Tag à Tag et utiliser les valeurs de là comme balise est l'élément, vous pouvez utiliser n'importe quel élément de celui-ci.

<Page.Resources>
    <ControlTemplate x:Key="MyTemplate" TargetType="{x:Type ContentControl}">
        <TextBlock Name="_this" Tag="{TemplateBinding Tag}" Margin="{Binding ElementName=_this, Path=Tag.Margin}" Text="{TemplateBinding Content}" TextAlignment="{Binding ElementName=_this, Path=Tag.TextAlignment}" Width="{Binding ElementName=_this, Path=Tag.Width}" />
    </ControlTemplate>
</Page.Resources>
<StackPanel>
    <TextBlock x:Name="AnotherElement" Margin="10" Text="Main TextBlock" TextAlignment="Center" Width="100" />
    <TextBlock x:Name="AnotherElement2" Margin="20" Text="Second TextBlock" TextAlignment="Left" Width="250" />
    <TextBlock Margin="{Binding ElementName=AnotherElement, Path=Margin}" Text="Here is my TextBlock!" TextAlignment="{Binding ElementName=AnotherElement, Path=TextAlignment}" TextTrimming="CharacterEllipsis" Width="{Binding ElementName=AnotherElement, Path=Width}" />
    <TextBlock Margin="{Binding ElementName=AnotherElement2, Path=Margin}" Text="Here is my Second TextBlock!" TextAlignment="{Binding ElementName=AnotherElement2, Path=TextAlignment}" TextTrimming="CharacterEllipsis" Width="{Binding ElementName=AnotherElement2, Path=Width}" />
    <ContentControl Content="Hello!" Tag="{Binding ElementName=AnotherElement}" Template="{StaticResource MyTemplate}" />
    <ContentControl Content="Hello Again!" Tag="{Binding ElementName=AnotherElement2}" Template="{StaticResource MyTemplate}" />
</StackPanel>
23
sa_ddam213