2016-08-09 114 views
0

Ich habe einen kundenspezifischen Knopf mit einem Winkel DependencyProperty:Databinding in Control DependencyProperty funktioniert, aber nach wie vor wirft Fehler

public static readonly DependencyProperty AngleProperty = DependencyProperty.Register(
     "Angle", 
     typeof(float), 
     typeof(TriangularButton), 
     new FrameworkPropertyMetadata(0f, FrameworkPropertyMetadataOptions.AffectsRender)); 

public float Angle 
{ 
    get { return (float)GetValue(AngleProperty); } 
    set { SetValue(AngleProperty, value); } 
} 

Im Control ich von unten binden möchten. Ich habe mehrere Möglichkeiten ausprobiert (siehe unten) und jeder funktioniert, aber ich bekomme einen System.Windows.Data Error. Wie werde ich es loswerden?

Was ich versucht:

<Button.Template> 
    <ControlTemplate TargetType="Button"> 
     <Path ...> 
      <Path.RenderTransform> 
       <RotateTransform Angle="{Binding Angle, RelativeSource={RelativeSource TemplatedParent}}"/> 
      </Path.RenderTransform> 
     </Path> 
    </ControlTemplate> 
</Button.Template> 

Dann bekomme ich:

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=Angle; DataItem=null; target element is 'RotateTransform' (HashCode=55197304); target property is 'Angle' (type 'Double')

Wenn ich dies tun:

<Button.Template> 
    <ControlTemplate TargetType="Button"> 
     <Path ...> 
      <Path.RenderTransform> 
       <RotateTransform Angle="{Binding Angle, RelativeSource={RelativeSource AncestorType=Button}}"/> 
      </Path.RenderTransform> 
     </Path> 
    </ControlTemplate> 
</Button.Template> 

Dann bekomme ich:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.Button', AncestorLevel='1''. BindingExpression:Path=Angle; DataItem=null; target element is 'RotateTransform' (HashCode=24935945); target property is 'Angle' (type 'Double')

EDIT

:

danken this answer ich die Ursache herausgefunden, ist wahrscheinlich, weil der Knopf zunächst nicht sichtbar ist. Wenn ich den Button an einer Stelle platziere, wo er anfänglich sichtbar ist, verschwindet der Fehler. Gibt es eine Möglichkeit, den Fehler loszuwerden, wenn ich den Button irgendwo benutze, der anfänglich nicht sichtbar ist?

Antwort

0

Sie brauchen nicht die Quelle angeben, wenn Sie Datacontext auf Ihrer Taste

EDIT angeben:

XAML:

<Window x:Class="Test.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:Test" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <TabControl> 
     <TabItem Header="1"/> 
     <TabItem Header="2"> 
      <Grid> 
       <local:TriangularButton Angle="45" Width="100" Height="100"> 
        <Button.Template> 
         <ControlTemplate TargetType="Button"> 
          <Path Stroke="Red" RenderTransformOrigin="0.5,0.5"> 
           <Path.Data> 
            <RectangleGeometry Rect="0,0,100,100"/> 
           </Path.Data> 
           <Path.RenderTransform > 
            <RotateTransform Angle="{Binding Angle, RelativeSource={RelativeSource TemplatedParent}}"/> 
           </Path.RenderTransform> 
          </Path> 
         </ControlTemplate> 
        </Button.Template> 
       </local:TriangularButton> 
      </Grid> 
     </TabItem> 
    </TabControl> 

</Grid> 

DP

rusing System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

using System.Windows; 
using System.Windows.Controls; 

namespace Test 
{ 
    public class TriangularButton : Button 
    { 
     public static readonly DependencyProperty AngleProperty = DependencyProperty.Register(
     "Angle", 
     typeof(float), 
     typeof(TriangularButton), 
     new FrameworkPropertyMetadata(0f, FrameworkPropertyMetadataOptions.AffectsRender)); 

    public float Angle 
    { 
     get { return (float)GetValue(AngleProperty); } 
     set { SetValue(AngleProperty, value); } 
    } 
} 

} Code hier

Und es funktioniert gut, auch ich öffne von einem anderen Tab.

First tab opened

Tab with button

Sie Render in Ihrem Pfad hinzufügen.

+0

Der DataContext ist der Button selbst. Die DependencyProperty befindet sich im Code dahinter. – gartenriese

+0

@gartenriese gib mir eine zweite –

+0

Ich habe vielleicht die Ursache für den Fehler gefunden, siehe die Bearbeitung. Ich weiß jedoch immer noch nicht, wie ich es loswerden soll. – gartenriese