的数据绑定控件模板来的DependencyProperty工作,但仍然抛出错误

问题描述:

我有一个角度的DependencyProperty自定义按钮:的数据绑定控件模板来的DependencyProperty工作,但仍然抛出错误

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); } 
} 

在我要绑定视角的ControlTemplate。我尝试了几种方法(见下文),每一种都有效,但是我得到一个System.Windows.Data错误。我如何摆脱它?

我的尝试:

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

然后我得到:

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')

当我这样做:

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

然后我得到:

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')

编辑:

感谢this answer我发现原因可能是因为按钮最初不可见。如果我把Button放在最初可见的地方,错误就会消失。当我在最初不可见的地方使用Button时,有没有办法摆脱错误?

你并不需要指定源,如果你对你的按钮

编辑指定的DataContext:

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); } 
    } 
} 

} 这里的代码

而且它很好用,即使我从另一个选项卡打开。

First tab opened

Tab with button

你可以在你的路径添加RenderTransformOrigin。

+0

DataContext是Button本身。 DependencyProperty在后面的代码中。 – gartenriese

+0

@gartenriese给我第二个 –

+0

我可能找到了错误的原因,请参阅编辑。但是我仍然不知道如何摆脱它。 – gartenriese