2011-12-14 130 views
6

比方说,我有一个自定义控件包装另一个控件(例如MyCustomButton)。我露出一个属性的内容,它包装内部控制:链接依赖属性

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

为了让消费者绑定到这个属性,我需要定义一个DependencyProperty吧:

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

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

​​

所以我不包装内部控制的价值了。

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

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

有没有更好的方法来做到这一点?

回答

2

那么,根据你为什么用一个用户控件包装一个按钮的细节,你可以定义一个继承自按钮的自定义控件。然后,您可以简单地覆盖要定义自定义控件的行为的方法和属性,而不是包装按钮并展示所需的包装方法和属性。这样,您将获得按钮的所有功能,而无需重新发明轮子。

下面是指导您完成这一个谷歌的链接(第一,我发现的一个 - 有很多):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(); 
    } 
} 

所以,你不需要通过代码来处理绑定。您的客户端XAML绑定到您的依赖属性,就像用户控件本身的XAML一样。以这种方式,他们共享依赖属性设置。我在我的小便笺簿中运行它,结果(至少我理解)你在找什么。主窗口将用户控件显示为带有文本“Asdf”的堆叠面板,然后显示带有文本“Click Me!”的按钮。

+0

用户控件还有其他问题。更新的问题。 – Jeff 2011-12-14 19:49:35