2016-04-24 13 views
1

Ich bin neu in WPF, und ich bin Ausführung einiger Simulationen die binding „Dinge“ zu verstehen, um zu versuchen (wie {Binding}, {TemplateBinding} ...)Warum TemplateBinding Button.Content nicht binden kann?

Ok, so dass ich hier diese Probe TemplateBinding zu testen und funktioniert gut :

<Button Width="100" Height="100"> 
    <Button.Style> 
     <Style TargetType="Button"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate> 
         <Image Source="image.png" Width="{TemplateBinding Width}" /> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Button.Style> 
</Button> 

Jetzt habe ich versucht, die gleichen, aber mit anderen Eigenschaften:

<Button Width="100" Height="100" Content="image.png"> 
    <Button.Style> 
     <Style TargetType="Button"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate> 
         <Image Source="{TemplateBinding Content}" /> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Button.Style> 
</Button> 

im ersten Fall erfolgt die Bindung perfekt. Aber in der Sekunde passiert nichts.

Was fehlt mir hier? Es gibt einige Eigenschaften, die andere nicht binden können?

Ich bin wirklich hier verloren, kann mir jemand erklären, warum einer funktioniert und der andere nicht?

Antwort

1

Ihre Bindungen sollten übereinstimmende Typen haben. Button.Content ist ein object, während Image.Source einen Uri erwartet. Statt ContentTag verwenden und es über einen Konverter umwandeln:

<Button Width="100" Height="100" Tag="image.png"> 
    <Button.Style> 
     <Style TargetType="Button"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate> 
         <Image Source="{TemplateBinding Tag, Converter={StaticResource ObjectToUriConverter}}" /> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Button.Style> 
</Button>  

Converter

1

TemplateBinding bei der Kompilierung ausgewertet wird und nicht automatisch Wert Typumwandlung bereitstellt (in diesem Fall string-ImageSource). Nur TemplatedParent relativ Quelle anstelle

<Image Source="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content}" /> 

Eine andere Sache zu binden, nicht direkt auf dieses Problem im Zusammenhang, ist, dass, wenn Sie TemplateBinding für andere Eigenschaften des gleichen Typs sicherstellen, verwenden möchten Sie TargetType entsprechend eingestellt. TemplateBinding ausgewertet gegen ControlTemplate Typen und Standard TargetType ist System.Windows.Controls.Control

<ControlTemplate TargetType="{x:Type Button}"> 
+0

Ihre Antwort helfen mir viele Bindungen zu verstehen + 1 . –

0

Ich glaube, Sie die Content is not recognised or is not accssible error bekommen könnten, anstatt Sie <Image Source="{Binding Content,ElementName=btn}" /> verwenden können, wo btn die Button Name. sind

Verwandte Themen