wpf - 链接依赖属性

标签 wpf xaml dependency-properties

假设我有一个自定义控件,它包装另一个控件(例如 MyCustomButton)。我公开了一个 Content 属性,它包装了内部控件:

    public object Content
    {
        get { return innerControl.Content; }
        set { innerControl.Content = value; }
    }

为了让消费者绑定(bind)到此属性,我需要为其定义一个 DependencyProperty:

 public static DependencyProperty ContentProperty = DependencyProperty.Register("Content", typeof (object), typeof (MyCustomButton));

但现在我需要属性定义来使用 GetValue/SetValue:

    public object Content
    {
        get { return GetValue(ContentProperty); }
        set { SetValue(ContentProperty, value); }
    }

所以我不再包装内部控件的值。

我可以定义 PropertyMetadata 来处理 DependencyProperty 的 PropertyChanged 事件,但随后我需要一堆管道代码来保持值同步并防止更改时无限循环。

更新:我不能只从 Button 派生,因为我的 UserControl 还有各种其他问题。

有更好的方法吗?

最佳答案

嗯,根据您使用用户控件包装按钮的具体原因,您可以定义一个继承自按钮的自定义控件。然后,您可以简单地重写要定义自定义控件行为的方法和属性,而不是包装按钮并公开所需的包装方法和属性。这样,您将获得按钮的所有功能,而无需重新发明轮子。

这里有一个谷歌链接,可以引导您完成它(我发现的第一个链接 - 有很多):http://knol.google.com/k/creating-custom-controls-with-c-net#

如果用户控件有其他问题,这可能不适合您,但我提供这个答案是因为您提到的唯一目的是包装按钮。如果相关控件只是一种更具体的包装/继承控件(即您的情况下的按钮),我个人更倾向于创建自定义控件并继承,而不是用户控件和包装。

编辑:根据更新的问题...

你可以按照这些思路做一些事情。以下是用户控件客户端的 XAML:

<Grid>
    <local:MyControl ButtonContent="Click Me!"/>
</Grid>
</Window>

这是用户控件本身的 XAML:

 <UserControl x:Class="GuiScratch.MyControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:GuiScratch"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>

        <StackPanel>
            <ContentControl Content="Asdf"/>
            <Button Content="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MyControl}},Path=ButtonContent}"/>
        </StackPanel>

    </Grid>
</UserControl>

而且,这是背后的代码:

public partial class MyControl : UserControl
{

    public static readonly DependencyProperty ButtonContentProperty = 
    DependencyProperty.Register("ButtonContent", typeof(object), typeof(MyControl), 
    new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender));

    public object ButtonContent
    {
        get { return (object)GetValue(ButtonContentProperty); }
        set { SetValue(ButtonContentProperty, value); }
    }

    public MyControl()
    {
        InitializeComponent();
    }
}

因此,您根本不需要通过代码处理绑定(bind)。您的客户端 XAML 绑定(bind)到您的依赖项属性,就像用户控件本身的 XAML 一样。通过这种方式,它们共享依赖属性设置。我在我的小草稿本中运行了这个,结果就是(至少我的理解)你正在寻找的东西。主窗口将用户控件显示为带有文本“Asdf”的堆栈面板,然后是带有文本“Click Me!”的按钮

关于wpf - 链接依赖属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8508390/

相关文章:

c# - 依赖属性如何工作?

Silverlight - 为什么要使用附加属性?

c# - 内部 StackPanel 不可见

c# - 更新元素时​​的 WPF 性能

wpf - 在 WPF 中旋转 3D 立方体

wpf - 如何让 ScrollViewer 在 StackPanel 中工作?

c# - UWP - ListView.ItemTemplate 中的 StateTrigger

c# - 无法从 UWP 应用程序连接到 SQL Server Express 数据库

wpf - WPF 中的自定义依赖属性和双向绑定(bind)

c# - 在 C# 中创建一个空的 BitmapSource