Свойство зависимости WPF - привязка данных не работает - PullRequest
4 голосов
/ 09 августа 2011

Как уже сказано в заголовке, у меня возникли проблемы при использовании привязки данных с DependencyProperty. У меня есть класс с именем HTMLBox:

public class HTMLBox : RichTextBox
{
    public static readonly DependencyProperty TextProperty = 
    DependencyProperty.Register("Text", typeof(string), typeof(HTMLBox));

    public string Text
    {
        get
        {
            return GetValue(TextProperty) as string;
        }
        set
        {
            Console.WriteLine("Setter...");
            SetValue(TextProperty, value);
        }
    }

    public HTMLBox()
    {
        // Create a FlowDocument
        FlowDocument mcFlowDoc = new FlowDocument();

        // Create a paragraph with text
        Paragraph para = new Paragraph();
        para.Inlines.Add(new Bold(new Run(Text)));

        // Add the paragraph to blocks of paragraph
        mcFlowDoc.Blocks.Add(para);

        this.Document = mcFlowDoc;
    }
}

Я читаю свойство Text в конструкторе, поэтому оно должно отображаться в виде текста, когда строка привязана к свойству. Но хотя я связываю некоторые данные со свойством Text в xaml, я даже не вижу «Setter ...» - сообщение, которое должно отображаться, когда установлено свойство Text.

    <local:HTMLBox Text="{Binding Text}" 
           Width="{Binding Width}"  
           AcceptsReturn="True" 
           Height="{Binding Height}" />

Если я изменю HTMLBox на TextBox, текст будет отображаться правильно, поэтому ошибка, вероятно, где-то в моем классе HTMLBox. Что я делаю не так?

1 Ответ

4 голосов
/ 09 августа 2011

У вас здесь есть несколько проблем:

  1. Не следует помещать логику в набор / получение вашего свойства CLR, которое оборачивает ваше свойство зависимости.Это свойство только для того, чтобы предоставить более удобный механизм для получения / установки вашего свойства зависимости.Нет гарантии, что парсер XAML вызовет этот установщик.Если вам нужно вызывать какую-либо логику при изменении свойства зависимости, сделайте это с помощью обработчика события изменения, когда вы регистрируете свойство зависимости через DependencyProperty.Register.
  2. Вы создаете пользовательский интерфейс вашего элемента управления в конструкторе, у вас есть времявыпуск здесь!Для создания экземпляра вашего класса сначала вызывается конструктор, а затем устанавливаются различные свойства.Text всегда будет значением по умолчанию в конструкторе.Опять же, аналогично решению (1), когда ваше свойство Text изменяется, перестройте / обновите свой пользовательский интерфейс.
...