WPF:从自定义控件中的模板中获取嵌入式控件的属性

时间:2017-08-28 08:29:25

标签: wpf xaml data-binding

我的自定义控件IconMD包含属性IconNameOverlayNameOverlayPosition

我已将此控件嵌入到另一个自定义控件IconButton中,如下所示:

<ControlTemplate TargetType="{x:Type local:IconButton}">
    <Border 
        Background="{TemplateBinding Background}"
        BorderBrush="{TemplateBinding BorderBrush}"
        BorderThickness="{TemplateBinding BorderThickness}">
        <Border.Style>
            <Style TargetType="{x:Type Border}">
                <Setter Property="Opacity" Value="0.7"/>
                <Style.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Opacity" Value="1"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Border.Style>
        <Grid>
            <local:IconMD
                x:Name="_ButtonIcon"
                OverlayPosition="{TemplateBinding OverlayPosition}"
                IconName="{TemplateBinding IconName}"
                OverlayName="{TemplateBinding OverlayIconName}"
            />
        </Grid>
    </Border>
</ControlTemplate>

OverlayPosition控件的依赖属性IconNameOverlayIconNameIconButton的唯一目的只是传递给嵌入式Icon - 与BorderBrush等。

现在,因为我还有IconToggleButtonIconRepeatButton(从相应的基类继承,不能从IconButton继承!),我必须为每个基类重复这种模式。如果我的IconMD类的功能增长,我将不得不在每个使用它的自定义控件中扩展此模式。

如何在我的IconMD之外简单地创建名为IconButton Control“_ButtonIcon”的(属性)?

我会想象而不是这个

<imCC:IconButton
    IconName="mdi-account-card-details"
    OverlayIconName="mdi-multiplication-box"/>

写这样的东西

<imCC:IconButton
    _ButtonIcon.IconName="mdi-account-card-details"
    _ButtonIcon.OverlayName="mdi-multiplication-box"/>

2 个答案:

答案 0 :(得分:1)

您可以将属性定义为可以在任何UIElementButton元素上设置的附加属性。

附加属性概述: https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/attached-properties-overview

namespace WpfApplication1
{
    public static class AttachedProperties
    {
        public static readonly DependencyProperty IsBubbleSourceProperty = DependencyProperty.RegisterAttached(
            "IconName", typeof(string), typeof(AttachedProperties));

        public static void SetIconName(UIElement element, string value)
        {
            element.SetValue(IsBubbleSourceProperty, value);
        }
        public static string GetIconName(UIElement element)
        {
            return (string)element.GetValue(IsBubbleSourceProperty);
        }
    }
}
<imCC:IconButton xmlns:local="clr-namespace:WpfApplication1"
    local:AttachedProperties.IconName="mdi-account-card-details" />

答案 1 :(得分:1)

您可以使用附加属性而不是普通依赖项属性(在带有剪切propa的visual studio中创建)。

如果您在课程IconName中创建IconButton作为附加属性,请按如下所示进行设置:

<imCC:IconButton
    imCC:IconButton.IconName="mdi-account-card-details"
    ...

并在ControlTemplate中使用,如下所示:

<local:IconMD
    x:Name="_ButtonIcon"
    IconName="{Binding Path=(local:IconButton.IconName),RelativeSource={RelativeSource TemplatedParent}}"
    ...