Страницы

Поиск по вопросам

вторник, 28 мая 2019 г.

Проблема с DependencyProperty

Такая ситуация. Есть класс
public partial class HighlightTextBlock : TextBlock { public ObservableCollection HighlightRules { get { return (ObservableCollection)GetValue(HighlightRulesProperty); } set { SetValue(HighlightRulesProperty, value); } }
// Using a DependencyProperty as the backing store for HighlightRules. This enables animation, styling, binding, etc... public static readonly DependencyProperty HighlightRulesProperty = DependencyProperty.Register("HighlightRules", typeof(ObservableCollection), typeof(HighlightTextBlock), new FrameworkPropertyMetadata(new ObservableCollection()));
// Ну далее еще много чего тут }
А вот класс HighlightRule
public class HighlightRule : DependencyObject { public ObservableCollection Highlights { get { return (ObservableCollection)GetValue(HighlightsProperty); } set { SetValue(HighlightsProperty, value); } }
// Using a DependencyProperty as the backing store for Highlights. This enables animation, styling, binding, etc... public static readonly DependencyProperty HighlightsProperty = DependencyProperty.Register("Highlights", typeof(ObservableCollection), typeof(HighlightRule), new PropertyMetadata(new ObservableCollection()));
// Тут тоже много чего еще }
вот как выглядит использование в XAML

Ну и вроде все должно быть норм, но очень уж тормозило, поэтому я залез в отладку и увидел, что на каждое правило приходится подсветок ровно столько, сколько всего существует правил. То есть в данном случае по числу элементов коллекции. Может, я не правильно как то пользуюсь свойствами зависимостей, потому что каждое правило ссылается на одни и те же подсветки (хотя как видно из xamla, каждому правилу соответствует одна подстветка в данном случае).
UPD:
Вот проект по примеру VladD
скачать


Ответ

Проблема вот где:
new PropertyMetadata(new ObservableCollection())
У вас получается, что вы один и тот же экземпляр ObservableCollection делаете значением по умолчанию свойства Highlights для всех экземпляров HighlightRule! Обычно эта проблема незаметна, если ваше свойство — value type, т. к. он при копировании клонируется, в отличие от ссылочного типа.
Делайте так:
public class HighlightRule : DependencyObject { public HighlightRule() { Highlights = new ObservableCollection(); }
public ObservableCollection Highlights { get { return (ObservableCollection)GetValue(HighlightsProperty); } set { SetValue(HighlightsProperty, value); } }
public static readonly DependencyProperty HighlightsProperty = DependencyProperty.Register( "Highlights", typeof(ObservableCollection), typeof(HighlightRule));
// Тут тоже много чего еще }

То же касается и HighlightTextBlock, разумеется.

Комментариев нет:

Отправить комментарий