我有各种各样的用户控件,我试图看看是否可以为它们创建一个具有一些依赖属性的基类。
具体来说,我的大多数用户控件都遵循这种格式......
<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
我在解决方案中找不到部分类的其他部分???我试图在整个解决方案中搜索它......
答案 0 :(得分:2)
你可以拥有继承权。像这样:
定义基类:
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));
}
定义继承的类:
public class Alpha : BaseExpanderUC{}
public class Bravo : BaseExpanderUC{}
在每个继承类(上面的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。
这将要求您为每个UC定义UI。如果您可以为所有控件提供通用UI,我强烈建议您使用自定义控件(可能继承Expander)。然后,您必须在ControlTemplate
。