FreezableCollection не предоставляет уведомление об изменении при изменении вложенных свойств - PullRequest
1 голос
/ 18 февраля 2011

У меня есть коллекция FreezableCollection, для которой я хочу отслеживать изменения в вложенных свойствах.Вот подраздел кода:

public class FieldHeading : DependencyObject
{
    public static readonly DependencyProperty LayoutProperty = DependencyProperty.Register("Layout", typeof(FieldHeadingLayout), typeof(FieldHeading),
        new FrameworkPropertyMetadata(FieldHeadingLayout.Above,
        FrameworkPropertyMetadataOptions.AffectsRender |
        FrameworkPropertyMetadataOptions.AffectsMeasure |
        FrameworkPropertyMetadataOptions.AffectsParentMeasure));

    public FieldHeadingLayout Layout
    {
        get { return (FieldHeadingLayout) GetValue(LayoutProperty); }
        set { SetValue(LayoutProperty, value); }
    }

}

public class FieldPanel : FrameworkElement
{
    private static readonly DependencyProperty FieldHeadingProperty = DependencyProperty.Register("FieldHeading", typeof(FreezableCollection<FieldHeading>), typeof(FieldPanel),
        new FrameworkPropertyMetadata(null,
            FrameworkPropertyMetadataOptions.AffectsMeasure |
            FrameworkPropertyMetadataOptions.AffectsParentMeasure |
            FrameworkPropertyMetadataOptions.AffectsRender, HeadingChanged));

    private static void HeadingChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        Debug.WriteLine("Hello");
    }

    public FreezableCollection<FieldHeading> FieldHeadings
    {
        get
        { return (FreezableCollection<FieldHeading>) GetValue(FieldHeadingProperty); }
        set { SetValue(FieldHeadingProperty, value);}
    }

    public FieldPanel()
    {
        AddVisual(_contentVisual = new DrawingVisual());
        FieldHeadings = new FreezableCollection<FieldHeading>();
    }
}

Затем мы присваиваем новое значение Layout для одного из FieldHeadings, уведомление об изменении не генерируется.Очевидно, я упускаю что-то важное.HeadingChanged никогда не вызывается.

Справка MSDN по FreezableCollection, которая находится здесь: FreezableCollection , состояния:

Событие изменено ... Происходит, когда Freezable или объект, который он содержит изменен.(Унаследовано от Freezable.)

Заранее благодарим за любую помощь.

~ Камерон

Ответы [ 3 ]

3 голосов
/ 18 февраля 2011

Обработчик уведомлений об изменениях будет уведомлять вас только при изменении значения свойства, поэтому в этом случае, если замораживаемая коллекция изменяется на новую коллекцию.В обработчике изменения свойства вы должны подписаться на событие CollectionChanged, и в этом случае вам нужно подписаться на событие PropertyChanged для нового элемента.Теперь, наконец, у вас есть событие, которое позволит вам реагировать на изменения свойств элементов, принадлежащих замораживаемой коллекции, которая является свойством зависимости.Не забудьте отписаться о событиях старой коллекции и старого предмета.

0 голосов
/ 14 августа 2014

На самом деле, вы можете делать то, что вы пытаетесь сделать. Именно поэтому существует FreezableCollection<T>! Все, что вам нужно сделать, это изменить FieldHeading, чтобы получить из Freezable вместо DependencyObject, и изменения в элементах коллекции будут давать такое же уведомление об изменении, как если бы весь элемент был заменен.

Это невероятно полезная и малоизвестная функция WPF.

От самого Чарльза Петцольда ,

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

0 голосов
/ 18 февраля 2011

Дело в том, что вы подписываетесь только на FieldHeadings изменения , то есть вы будете получать уведомления, только если кто-то назначит новый экземпляр самой коллекции, используя, например, FeildHedingsсвойство setter.

Чтобы получать уведомления об изменении свойства Layout, необходимо подписаться на него на каждый отдельный экземпляр FieldHeading.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...