WPF: Как использовать значение свойства зависимости в другом свойстве зависимости? - PullRequest
0 голосов
/ 24 марта 2011

Хорошо, это немного сложнее.Я создал пользовательский элемент управления MonthViewControl:

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>

Кодовый код:

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

Затем я создал пользовательский элемент управления MonthWeekControl:

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 />
        </ItemsControl>
    </Grid>
</UserControl>

Код:

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

Проблема в том, что я не знаю, как получить свойство зависимости Date из MonthViewControlчтобы использовать его в MonthWeekControl.Как вы можете видеть в определении свойства зависимостей WeekNumber для MonthWeekControl, для вычисления номера недели необходима дата.

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

Ответы [ 2 ]

1 голос
/ 24 марта 2011

Эта строка кода, которая у вас есть, является статической. это означает, что он будет выполняться только один раз и что он не может ссылаться на что-либо еще, что не статично.

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

Откажитесь от UIPropertyMetadata, который у вас здесь - это для установки начального значения по умолчанию для всех экземпляров класса. Это не подходит в этом случае.

Вместо этого сделайте так, чтобы ваш MonthViewControl перебирал каждый из его MonthWeekControl и устанавливал для них свойство WeekNumber соответствующим образом. Делайте это всякий раз, когда изменяется свойство Date в MonthViewControl. Итак, теперь задача состоит в том, чтобы узнать, что свойство Date изменяется ... измените UIPropertyMetadata, который вы используете для регистрации этого свойства, на тот, который принимает метод обратного вызова. Этот обратный вызов будет вызываться всякий раз, когда свойство изменяется, и тогда именно там вы устанавливаете значения переменной WeekNumber. Подробности смотрите здесь: http://msdn.microsoft.com/en-us/library/ms557330.aspx

0 голосов
/ 24 марта 2011

Вместо установки значения по умолчанию свойства зависимости WeekNumber в MonthWeekControl, вы можете установить привязку в конструкторе экземпляра:

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