Когда визуализировать пользовательский WPF TextBlock? - PullRequest
0 голосов
/ 05 июня 2011

Когда я должен строить 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: Возможно, лучшим решением может быть создание привязываемых строк?

1 Ответ

0 голосов
/ 06 июня 2011

DataGrids виртуализируют свой контент, поэтому, если строка не видна, она не будет загружена. В таком случае, вы пытались также перестроить строки при возникновении события Loaded?

...