Когда я должен строить Inlines в TextBlock? У меня есть класс, производный от TextBlock, который при задании текста в определенном поле, называемом MyText, преобразует текст в набор строк при изменении MyText.
Всякий раз, когда меняется MyText, я очищаю строки и строю их, окрашивая каждое слово по мере необходимости. Для этого примера рассмотрим:
private void MyTextBlock_MyTextChanged(object sender, EventArgs e)
{
Inlines.Clear();
if (!string.IsNullOrEmpty(this.MyText))
{
var run = new Run();
run.Foreground = Brushes.DarkRed;
run.Text = this.MyText;
Inlines.Add(run);
}
}
Это сработало очень хорошо. Однако недавно мы поместили элемент управления в сетку данных, и некоторые странные вещи начали происходить. Очевидно, DataGrid меняет контекст, и по большей части это работает. Однако, когда мы добавляем или удаляем данные из DataSrid ItemsSource, что-то идет не так, и TextChanged не похоже на то, что он вызывается (или, по крайней мере, не вызывается одновременно). MyText может иметь одно значение, а Inlines может быть пустым или другим значением.
Я думаю, что место для создания Inlines НЕ во время MyTextChanged, но, возможно, когда начинается рендеринг элемента управления. Я также пытался, когда DataContextChanged, но это не помогает.
В моем конструкторе у меня есть
this.myTextDescriptor = DependencyPropertyDescriptor.FromProperty(
MyTextProperty, typeof(MyTextBlock));
if (this.myTextDescriptor != null)
{
this.myTextDescriptor.AddValueChanged(this, this.MyTextBlock_MyTextChanged);
}
соответствует свойству зависимости, которое у меня есть в классе
public string MyText
{
get { return (string)GetValue(MyTextProperty); }
set { SetValue(MyTextProperty, value); }
}
public static readonly DependencyProperty MyTextProperty =
DependencyProperty.Register("MyText", typeof(string), typeof(MyTextBlock));
private readonly DependencyPropertyDescriptor myTextDescriptor;
Обновление: Если это какая-либо подсказка, проблемные ячейки DataGrid, по-видимому, являются теми, которые находятся вне экрана, когда происходит добавление или удаление. Я также попробовал OnApplyTemplate, но это не помогло.
Обновление 2: Возможно, лучшим решением может быть создание привязываемых строк?