web-dev-qa-db-ja.com

ControlTemplate内でElementNameバインディングを使用するにはどうすればよいですか?

アプリケーションのさまざまな要素を参照する複数のTextBlockがあります。ページで直接使用すると、私のコードは正常に動作します。ただし、コードの重複を減らすために、ControlTemplateとContentControlを作成したいと考えています。

ElementBindingを使用して、ElementNameへの参照をContentControlからControlTemplateに渡すにはどうすればよいですか?次のコードはこのエラーをスローします。

「属性「ElementName」の値をタイプ「System.String」のオブジェクトに変換できません。タイプ「System.Windows.TemplateBindingExpression」のオブジェクトをタイプ「System.String」に変換できません。」

Tag属性に加えて、機能しないContentStringFormatを試しました。

テンプレートを使用してこれを機能させるための正しい方法は何ですか?

よろしくお願いいたします。

---ショーン

次にコードサンプルを示します。

<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

これは何かをテンプレート化する面白い方法のように見えますが、それは実行できます。バインディングを少し凝らす必要があります。

以下は動作しますが、これはコントロールをテンプレート化する良い方法だとはまだ思いません

TextBlockTagを実際の要素にバインドし、次にControlTemplateバインドTagTagにバインドして、そこからの値をタグとして使用します要素です。そこから任意の要素を使用できます。

<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