Почему эта привязка не работает должным образом, даже если она получает значение из источника?

У меня есть свой собственный класс:

public class PeriodContainerPanel:StackPanel
{
    public PeriodContainerPanel()
        : base()
    {
        addCollectionsToStackPanel();
    }

    private void addCollectionsToStackPanel()
    {
        this.Children.Clear();


        if (PeriodsList!=null)
        {
            double minutes = PeriodsList.Count * (Properties.Settings.Default.EndTimeSpan - Properties.Settings.Default.StartTimeSpan).TotalMinutes;
            foreach (ObservableCollection<PeriodBase> lst in PeriodsList)
            {
                this.Children.Add(new ChartUserControl(lst) { Minutes = minutes });
            }
        }
    }

    public List<ObservableCollection<PeriodBase>> PeriodsList
    {
        get { return (List<ObservableCollection<PeriodBase>>)GetValue(PeriodsListProperty); } //do NOT modify anything in here
        set { SetValue(PeriodsListProperty, value); addCollectionsToStackPanel(); } //...or here
    }

    public static readonly DependencyProperty PeriodsListProperty =
        DependencyProperty.Register(
        "PeriodsList",  //Must be the same name as the property created above
        typeof(List<ObservableCollection<PeriodBase>>), //Must be the same type as the property created above
        typeof(PeriodContainerPanel), //Must be the same as the owner class
        new UIPropertyMetadata(
            null  //default value, must be of the same type as the property
            ));
}

И я использую это DependencyPropertyPeriodList в UserControl как это:

<GridViewColumn>
   <GridViewColumn.CellTemplate>
   <DataTemplate>
      <UI:PeriodContainerPanel PeriodsList="{Binding RelativeSource={RelativeSource  Mode=TemplatedParent}, Path=DataContext}" />
   </DataTemplate>
   </GridViewColumn.CellTemplate>
</GridViewColumn>

Я проверяю с Convertor есть ли процесс получения (если есть значение) да, есть значение, и это правильно, но не установлено PeriodsList имущество. Что проблема? PS если есть какие-либо вопросы по поводу кода, пожалуйста, скажите, я могу добавить

2 ответа

Решение

addCollectionsToStackPanel() не будет вызываться, когда происходит связывание. Механизм привязки использует SetValue напрямую, и поэтому вы никогда не должны делать подобную логику в свойстве. (Вот почему в автоматически сгенерированном комментарии написано "НЕ модифицируйте ничего")

Использовать PropertyChangedCallback для этого сценария: http://msdn.microsoft.com/en-us/library/ms745795.aspx

Как и предложил @MrDosu, используйте PropertyChangedCallback для свойства DependencyProperty. Проблема с тем, что Callback является статическим, не такая уж большая проблема, так как вы получите ссылку на DependencyObject в вызове:

private static void ValueChangedCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
  ((MyCustomControl)d).RaiseMyValueChanged(); //Where RaiseMyValueChanged is a private non-static method.
}

Кроме того, использование TemplatedParent и Path=DataContext кажется странным. Путь должен указывать на свойство. TemplatedParent используется при определении стилей и / или шаблонов элементов управления, ваш фрагмент XAML не является шаблоном элемента управления в ресурсе, верно?

Другие вопросы по тегам