可继承的依赖项属性

时间:2013-04-09 14:58:36

标签: c# wpf inheritance user-controls dependency-properties

我有各种各样的用户控件,我试图看看是否可以为它们创建一个具有一些依赖属性的基类。

具体来说,我的大多数用户控件都遵循这种格式......

<UserControl DataContext="{Binding MyDataContext}" >
    <Expander IsExpanded="{Binding MyExpandedByDefault}">
        <TextBlock>Some text</TextBlock>
    </Expander>
</UserControl>

当然,通常如果这只是一次性的,我会在上面的用户控件的代码中编写依赖属性。但是,由于我有多个遵循相同格式的用户控件,我想在基类中添加如下内容......

public bool ExpandedByDefault
{
    get { return (bool)GetValue(ExpandedByDefaultProperty); }
    set { SetValue(ExpandedByDefaultProperty, value); }
}

public static readonly DependencyProperty ExpandedByDefaultProperty =
    DependencyProperty.Register("ExpandedByDefault", typeof(bool), typeof(MyBaseView), new UIPropertyMetadata());

我希望在某个地方继承,所以在我的主窗口中,我可以做类似......

<Window>
    <StackPanel>
        <my:Alpha ExpandedByDefault="True" />
        <my:Bravo ExpandedByDefault="False" />
    </StackPanel>
</Window>

由于

修改

我已经建立了一个基类......

public class ViewBase : UserControl
{
    public static readonly DependencyProperty ExpandedByDefaultProperty =
                 DependencyProperty.Register("ExpandedByDefault",
                                             typeof(bool),
                                             typeof(FiapaDbViewerBase),
                                             new FrameworkPropertyMetadata());

    public bool ExpandedByDefault
    {
        get
        {
            return (bool)this.GetValue(ExpandedByDefaultProperty);
        }
        set
        {
            this.SetValue(ExpandedByDefaultProperty, value);
        }
    }
}

但是当我尝试在我的用户控件后面的代码中继承它时,就像这样......

public partial class MyUserControl : ViewBase
{
    public MyUserControl()
    {
        InitializeComponent();
    }
}

我收到错误说

Partial declarations of 'MyUserControl' must not specify different base classes

我在解决方案中找不到部分类的其他部分???我试图在整个解决方案中搜索它......

1 个答案:

答案 0 :(得分:2)

你可以拥有继承权。像这样:

  1. 定义基类:

    public class BaseExpanderUC : UserControl
    {
        public bool ExpandedByDefault
        {
            get { return (bool)GetValue(ExpandedByDefaultProperty); }
            set { SetValue(ExpandedByDefaultProperty, value); }
        }
    
        public static readonly DependencyProperty ExpandedByDefaultProperty =
            DependencyProperty.Register("ExpandedByDefault", typeof(bool), typeof(MyBaseView), new UIPropertyMetadata(false));
    }
    
  2. 定义继承的类:

    public class Alpha : BaseExpanderUC{}
    public class Bravo : BaseExpanderUC{}
    
  3. 在每个继承类(上面的Alpha和Bravo)的每个XAML中,使用此makup:

    <BaseExpanderUC>
        <Expander IsExpanded="{Binding MyExpandedByDefault,
                                       RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:BaseExpanderUC}}}">
            <TextBlock>Some text</TextBlock>
        </Expander>
    </BaseExpanderUC>
    

    其中“local”是BaseExpanderUC命名空间的xmlns。

  4. 这将要求您为每个UC定义UI。如果您可以为所有控件提供通用UI,我强烈建议您使用自定义控件(可能继承Expander)。然后,您必须在ControlTemplate

    中仅定义一次UI