开发者

WPF: How to use dependecy property value in another dependecy property?

开发者 https://www.devze.com 2023-02-19 06:12 出处:网络
Ok, it\'s a tiny bit complex. I created a MonthViewControl user control: Xaml: <UserControl x:Class=\"MonthView.Controls.MonthViewControl\"

Ok, it's a tiny bit complex. I created a MonthViewControl user control:

Xaml:

<UserControl x:Class="MonthView.Controls.MonthViewControl"
             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:controls="clr-namespace:MonthView.Controls" 
             DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <!-- The following line is important! -->
    <TextBlock Text="{Binding Path=Date, Converter={...}}" />
    <ItemsControl>
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <UniformGrid Rows="6" Columns="1" />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <controls:MonthWeekControl />
        <controls:MonthWeekControl />
        <controls:MonthWeekControl />
        <controls:MonthWeekControl />
        <controls:MonthWeekControl />
        <controls:MonthWeekControl />
    </ItemsControl>
</UserControl>

Code-behind:

public partial class MonthViewControl : UserControl
{
    public static readonly DependencyProperty DateProperty =
        DependencyProperty.Register("Date", typeof(DateTime), 
        typeof(MonthViewControl), 
        new UIPropertyMetadata(DateTime.Today));

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

    public MonthViewControl()
    {
        InitializeComponent();
    }
}

Next, I created MonthWeekControl user control:

Xaml:

<UserControl x:Class="MonthView.Controls.MonthWeekControl"
             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:controls="clr-namespace:MonthView.Controls"
             DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="30" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <Border Grid.Column="0">
            <!-- The following line is important! -->
            <TextBlock Text="{Binding Path=WeekNumber}" />
        </Border>
        <ItemsControl Grid.Column="1">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <UniformGrid Rows="1" Columns="7" />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <controls:MonthDayControl />
            <controls:MonthDayControl />
            <controls:MonthDayControl />
            <controls:MonthDayControl />
            <controls:MonthDayControl />
            <controls:MonthDayControl />
            <controls:MonthDayControl />
     开发者_C百科   </ItemsControl>
    </Grid>
</UserControl>

Code behind:

public partial class MonthWeekControl : UserControl
{
    public static readonly DependencyProperty WeekNumberProperty =
        DependencyProperty.Register("WeekNumber", typeof(int), 
        typeof(MonthWeekControl), 
        new UIPropertyMetadata(Utilities.GetWeekInYear(dateFromMonthViewControl)));
    // Utilities.GetWeekInYear(DateTime date) gets the week number 
    // based on the provided date

    public int WeekNumber
    {
        get { return (int)GetValue(WeekNumberProperty); }
        set { SetValue(WeekNumberProperty, value); }
    }

    public MonthWeekControl()
    {
        InitializeComponent();
    }
}

The problem is that I don't know how to reach the Date dependency property from MonthViewControl in order to use it in MonthWeekControl. As you can see in the definition of the WeekNumber dependency property of the MonthWeekControl, it needs the date in order to calculate the week number.

Please help. Thanks!


This line of code that you have is static. that means it will only get executed once ever - and that it can't reference anything else that isn't static.

public static readonly DependencyProperty WeekNumberProperty =
   DependencyProperty.Register("WeekNumber", typeof(int),         
     typeof(MonthWeekControl),         
     new UIPropertyMetadata(Utilities.GetWeekInYear(dateFromMonthViewControl)));

Ditch the UIPropertyMetadata you have here - this is for setting a default initial value for all instances of the class. That isn't appropriate in this case.

Instead, have your MonthViewControl iterate over each of it's MonthWeekControl's and set the WeekNumber property on them as appropriate. Do that whenever the Date property of the MonthViewControl changes. So now the challenge is to know what the Date property changes... change the UIPropertyMetadata you use for registering this property to be one that takes a callback method. This callback will get invoked whenever the property changes - and then thats where you set the varios WeekNumber values. See here for details: http://msdn.microsoft.com/en-us/library/ms557330.aspx


Instead of setting the default value of WeekNumber dependency property in MonthWeekControl, you can set a binding in the instance constructor:

public MonthWeekControl()
{
    InitializeComponent();
    SetBinding(WeekNumberProperty, new Binding("Date")
    {
        RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor,
            typeof (MonthViewControl)),
        Converter = /* an instance of Date-to-WeekNumber converter */
    });
}
0

精彩评论

暂无评论...
验证码 换一张
取 消