c#uwp templatebinding和dependency属性

时间:2017-06-30 15:22:13

标签: c# binding uwp dependency-properties templatebinding

在UWP中,我正在尝试更改工具提示的默认模板。

我已经设法了,但现在我需要设置工具提示箭头指出它所属的控件。

我的风格定义如下:

    <Style TargetType="ToolTip">
        <Setter Property="Foreground" Value="White" />
        <Setter Property="Background" Value="{ThemeResource SystemControlBackgroundChromeMediumLowBrush}" />
        <Setter Property="BorderBrush" Value="{ThemeResource SystemControlForegroundChromeHighBrush}" />
        <Setter Property="BorderThickness" Value="{ThemeResource ToolTipBorderThemeThickness}" />
        <Setter Property="FontFamily" Value="Roboto" />
        <Setter Property="FontSize" Value="{ThemeResource ToolTipContentThemeFontSize}" />
        <Setter Property="Padding" Value="40,40,40,35"/>

        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ToolTip">

                    <Grid Background="Transparent">

                        <Grid 
                            MinWidth="100"
                            MinHeight="90"
                            Height="{TemplateBinding Height}"
                            Width="{TemplateBinding Width}" 
                            Padding="15" 
                            Background="Transparent">

依此类推......

但是现在我正在尝试使用TemplateBinding属性进行UserControl绑定。

我创建了具有一些dependecncy属性的UserControl。 像这样:

    public PlacementMode TooltipPlacement
    {
        get { return (PlacementMode)GetValue(TooltipPlacementProperty); }
        set { SetValue(TooltipPlacementProperty, value);  CalculateArrowVisibility(); }
    }

    public static readonly DependencyProperty TooltipPlacementProperty =
        DependencyProperty.Register("TooltipPlacement", typeof(PlacementMode), typeof(ArrowDown), null);

CalculateArrowVisibility()是一种根据TooltipPlacement计算箭头位置的方法。

该控件的样式定义如下:

<local:ArrowDown x:Name="arrow" TooltipPlacement="{TemplateBinding Placement}"/>

但它没有约束,我尝试了其他TemplateProperties但也没有运气。

这里的问题在哪里?

1 个答案:

答案 0 :(得分:1)

你非常关注依赖属性错误的方式。

你永远不应该修改它的getter和setter。相反,在其属性中调用您的CalculateArrowVisibility方法更改回调,如下所示 -

public PlacementMode TooltipPlacement
{
    get => (PlacementMode)GetValue(TooltipPlacementProperty);
    set => SetValue(TooltipPlacementProperty, value);
}
public static readonly DependencyProperty TooltipPlacementProperty =
    DependencyProperty.Register("TooltipPlacement", typeof(PlacementMode), typeof(ArrowDown), 
        new PropertyMetadata(null, TooltipPlacementChangedCallback));

private static void TooltipPlacementChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var self = (ArrowDown)d;
    self.CalculateArrowVisibility();
}