#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, разумеется.