继承DependencyProperties

时间:2014-03-10 06:32:36

标签: c# wpf dependency-properties

我创建了几个UserControl,比如 HeaderedDatePicker

UserControl的XAML如下:

<UserControl x:Class="Book.CustomControls.HeaderedDatePicker"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             DataContext="{Binding RelativeSource={RelativeSource Self}}"
             Width="200" Height="50">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <TextBlock Grid.Row="0" Margin="2,2" VerticalAlignment="Center" Text="{Binding Header}" FontWeight="{Binding HeaderFontWeight}"/>
        <DatePicker Grid.Row="1" Margin="2,2" VerticalAlignment="Center" SelectedDate="{Binding Date, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
    </Grid>
</UserControl>

注册DependencyProperty的代码隐藏是:

public partial class HeaderedDatePicker : UserControl
{
    public HeaderedDatePicker()
    {
        this.InitializeComponent();
        this.HeaderFontWeight = FontWeights.Normal;
        this.Date = DateTime.Now;
    }

    public static readonly DependencyProperty HeaderProperty = DependencyProperty.Register("Header", typeof(string), typeof(HeaderedDatePicker));
    public static readonly DependencyProperty HeaderFontWeightProperty = DependencyProperty.Register("HeaderFontWeight", typeof(FontWeight), typeof(HeaderedDatePicker));
    public static readonly DependencyProperty DateProperty = DependencyProperty.Register("Date", typeof(DateTime), typeof(HeaderedDatePicker));

    public string Header
    {
        get { return (string)GetValue(HeaderProperty); }
        set { SetValue(HeaderProperty, value); }
    }

    public FontWeight HeaderFontWeight
    {
        get { return (FontWeight)GetValue(HeaderFontWeightProperty); }
        set { SetValue(HeaderFontWeightProperty, value); }
    }

    public DateTime Date
    {
        get { return (DateTime)GetValue(DateProperty); }
        set { SetValue(DateProperty, value); }
    }
}

一切都很好。现在我想创建另一个像HeaderedComboBox那样的HeaderedControl。我现在的问题是:

我是否必须在每个Code-Behind-File中编写HeaderProperty和HeaderFontWeightProperty,或者有没有办法在基类中执行此操作?

我尝试创建一个注册属性的基类,但是在HeaderedDatePicker的代码隐藏中,我无法从我的类继承

2 个答案:

答案 0 :(得分:2)

public class main : UserControl
{
    public static readonly DependencyProperty HeaderProperty = DependencyProperty.Register("Header", typeof(string), typeof(main));
    public static readonly DependencyProperty HeaderFontWeightProperty = DependencyProperty.Register("HeaderFontWeight", typeof(FontWeight), typeof(main));
    public static readonly DependencyProperty DateProperty = DependencyProperty.Register("Date", typeof(DateTime), typeof(main));

    public string Header
    {
        get { return (string)GetValue(HeaderProperty); }
        set { SetValue(HeaderProperty, value); }
    }

    public FontWeight HeaderFontWeight
    {
        get { return (FontWeight)GetValue(HeaderFontWeightProperty); }
        set { SetValue(HeaderFontWeightProperty, value); }
    }

    public DateTime Date
    {
        get { return (DateTime)GetValue(DateProperty); }
        set { SetValue(DateProperty, value); }
    }

}

然后在每个UserControl中,你应该从之前声明的main派生。

    public partial class HeaderedComboBox : main
{
    public HeaderedComboBox()
    {
        this.InitializeComponent();
        this.DataContext = this;
    } 
}

最后

<local:main x:Class="WpfApplication5.HeaderedComboBox"
         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:WpfApplication5"
         mc:Ignorable="d" 
         Width="200" Height="50">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <TextBlock Grid.Row="0" Margin="2,2" VerticalAlignment="Center" Text="{Binding Header}" FontWeight="{Binding HeaderFontWeight}"/>
    <ComboBox Grid.Row="1" Margin="2,2" VerticalAlignment="Center" ItemsSource="{Binding ItemsSource, UpdateSourceTrigger=PropertyChanged}"
              SelectedItem="{Binding SelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</Grid>

让我知道它是否有效。

答案 1 :(得分:0)

您可以注册附加财产。见link。附加属性可用于任何依赖项对象。