通过xaml设置usercontrol的自定义依赖属性

本文关键字:自定义 依赖 属性 usercontrol xaml 设置 通过 | 更新日期: 2023-09-27 18:12:30

下面是我的用户控件(MonthCal)的代码。

public partial class MonthCal : UserControl
{
    public DayOfWeek StartDayOfWeek { get { return (DayOfWeek)GetValue(StartDayOfWeekProperty); } set { SetValue(StartDayOfWeekProperty, value); } }
    public static readonly DependencyProperty StartDayOfWeekProperty = DependencyProperty.Register("StartDayOfWeek", typeof(DayOfWeek), typeof(MonthCellHeader), new UIPropertyMetadata(DayOfWeek.Sunday, StartDayOfWeek_PropertyChanged));
    //...
}

,这是一个月的例子。

<UserControl x:Class="GCDR.MonthCal"
             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" 
             mc:Ignorable="d">
    <!-- ... -->
</UserControl>

所以,我怎么能设置'StartDayOfWeek'依赖属性在xaml?如你们所知,下面的代码是不可能的:

<UserControl ...
             StartDayOfWeek="Sunday">
</UserControl>

请帮帮我。

通过xaml设置usercontrol的自定义依赖属性

你不能在UserControl的标记中使用依赖属性,但是你可以在用户控件的实例中使用它,像这样:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1">
    <Grid>
        <local:UserControl1 local:StartDayOfWeek="Friday" />
    </Grid>
</Window>

在你的用户控件中,你可以绑定一些其他的属性到你的依赖属性,像这样:

<UserControl x:Class="WpfApplication1.UserControl1"
             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:WpfApplication1"
             mc:Ignorable="d" >
    <Grid>
        <Label Content="{Binding RelativeSource={RelativeSource AncestorType=local:UserControl1},Path=StartDayOfWeek}"  />
    </Grid>
</UserControl>

不能设置StartDayOfWeek的原因是XAML中的UserControl没有StartDayOfWeek依赖属性,换句话说UserControl类型不是MonthCal类型。

在XAML中,UserControl是UserControl1的基类,你可以定义继承UserControl的MonthCal,然后在XAML中声明MonthCal。

XAML

<local:MonthCal x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfApplication1" Title="MainWindow"
                Height="350" Width="525"
                StartDayOfWeek="Monday">
    <Grid></Grid>
</local:MonthCal>

Codebehinde

namespace WpfApplication1
{
    public class MonthCal : Window
    {
        public DayOfWeek StartDayOfWeek { get { return (DayOfWeek)GetValue(StartDayOfWeekProperty); } set { SetValue(StartDayOfWeekProperty, value); } }
        public static readonly DependencyProperty StartDayOfWeekProperty = 
            DependencyProperty.Register("StartDayOfWeek", typeof(DayOfWeek), typeof(MonthCal), new UIPropertyMetadata(DayOfWeek.Sunday, StartDayOfWeek_PropertyChanged));
        private static void StartDayOfWeek_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
        }
    }
    public partial class MainWindow : MonthCal
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}