Связывание WPF не работает - PullRequest
0 голосов
/ 20 ноября 2010

Я почти уверен, что делаю что-то ужасно неправильно, но не могу понять.

Я создал простую обертку вокруг класса и добавил свойство зависимости, чтобы я мог связываться с ним. Однако привязка не дает ошибок, но ничего не делает.

Для упрощения я изменил класс на TextBox и получил те же результаты.

public class TextEditor : TextBox
{
    #region Public Properties

    #region EditorText
    /// <summary>
    /// Gets or sets the text of the editor
    /// </summary>
    public string EditorText
    {
      get
      {
        return (string)GetValue(EditorTextProperty);
      }

      set
      {
        //if (ValidateEditorText(value) == false) return;
        if (EditorText != value)
        {
          SetValue(EditorTextProperty, value);
          base.Text = value;

          //if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("EditorText"));
        }
      }
    }

    public static readonly DependencyProperty EditorTextProperty =
        DependencyProperty.Register("EditorText", typeof(string), typeof(TextEditor));
    #endregion

    #endregion

    #region Constructors

    public TextEditor()
    {
      //Attach to the text changed event
      //TextChanged += new EventHandler(TextEditor_TextChanged);
    }

    #endregion

    #region Event Handlers

    private void TextEditor_TextChanged(object sender, EventArgs e)
    {
      EditorText = base.Text;
    }

    #endregion
}

Когда я запускаю следующий XAML, первый дает результаты, но второй (EditorText) даже не затрагивает свойство EditorText.

<local:TextEditor IsReadOnly="True" Text="{Binding Path=RuleValue, Mode=TwoWay}" WordWrap="True" />
<local:TextEditor IsReadOnly="True" EditorText="{Binding Path=RuleValue, Mode=TwoWay}" WordWrap="True" />

1 Ответ

4 голосов
/ 20 ноября 2010

Вы выполняете дополнительную работу в своем свойстве CLR.Нет никаких гарантий, что ваше свойство CLR будет использоваться WPF, поэтому вам не следует этого делать.Вместо этого используйте метаданные на вашем DP для достижения того же эффекта.

public string EditorText
{
  get { return (string)GetValue(EditorTextProperty); }
  set { SetValue(EditorTextProperty, value); }
}

public static readonly DependencyProperty EditorTextProperty =
    DependencyProperty.Register(
        "EditorText",
        typeof(string),
        typeof(TextEditor),
        new FrameworkPropertyMetadata(OnEditorTextChanged));

private static void OnEditorTextChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
{
    var textEditor = dependencyObject as TextEditor;

    // do your extraneous work here
}
...