Установка пользовательской зависимости proeprty Usercontrol с помощью xaml - PullRequest
2 голосов
/ 26 октября 2011

Вот код моего пользовательского элемента управления (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));
    //...
}

, а также вот xaml из MonthCal.

<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>

Пожалуйста, помогите мне.

Ответы [ 2 ]

1 голос
/ 26 октября 2011

Вы не можете использовать свойство зависимостей в разметке 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>
0 голосов
/ 26 октября 2011

Почему нельзя установить StartDayOfWeek из-за того, что UserControl в XAML не имеет свойства зависимости StartDayOfWeek, другими словами, тип UserControl не является типом MonthCal.

Как и в XAML, UserControl является базовым классом UserControl1, вы можетеопределите MonthCal, унаследованный UserControl, а затем объявите MonthCal в XAML.

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();
        }
    }
}
...