Страницы

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

воскресенье, 8 марта 2020 г.

Проблема с DependencyProperty

#c_sharp #net #wpf #xaml


Такая ситуация. Есть класс

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

скачать
    


Ответы

Ответ 1



Проблема вот где: 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, разумеется.

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

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