#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, разумеется.
Комментариев нет:
Отправить комментарий