的数据绑定控件模板来的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); }
}
}
} 这里的代码
而且它很好用,即使我从另一个选项卡打开。
你可以在你的路径添加RenderTransformOrigin。
DataContext是Button本身。 DependencyProperty在后面的代码中。 – gartenriese
@gartenriese给我第二个 –
我可能找到了错误的原因,请参阅编辑。但是我仍然不知道如何摆脱它。 – gartenriese