【问题标题】:DataBinding in ControlTemplate to DependencyProperty works, but still throws errorsControlTemplate 中的 DataBinding 到 DependencyProperty 有效,但仍会引发错误
【发布时间】:2016-08-09 07:42:18
【问题描述】:

我有一个带有 Angle 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 中,我想绑定到 Angle。我尝试了几种方法(见下文),每种方法都有效,但我得到了 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 错误:2:找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement。绑定表达式:路径=角度;数据项=空;目标元素是 'RotateTransform' (HashCode=55197304);目标属性是“角度”(类型“双”)

当我这样做时:

<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 错误:4:无法通过引用“RelativeSource FindAncestor,AncestorType='System.Windows.Controls.Button',AncestorLevel='1'”找到绑定源。绑定表达式:路径=角度;数据项=空;目标元素是 'RotateTransform' (HashCode=24935945);目标属性是“角度”(类型“双”)

编辑:

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

【问题讨论】:

    标签: c# wpf data-binding dependency-properties


    【解决方案1】:

    如果在按钮上指定 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 给我一秒钟
    • 我可能已经找到了错误的原因,请参阅编辑。但是我仍然不知道如何摆脱它。
    • 但这对我有用,你想旋转按钮吗?据我了解
    猜你喜欢
    • 2011-03-06
    • 1970-01-01
    • 2018-05-12
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多