Two-way binding in AvalonEdit doesn't work

avalonedit, c#, data-binding, dependency-properties, wpf

Solution

WPF bindings do not use your `DocumentText` property; instead they access the underlying value of the dependency property directly.

Your `OnTextChanged` method doesn't actually change the value of the underlying dependency property. You will need to copy the value from `base.Text` into the dependency property on every change:

protected override void OnTextChanged(EventArgs e)
{
    SetCurrentValue(DocumentTextProperty, base.Text);
    base.OnTextChanged(e);
}

This issue would be easier to see if you followed the correct pattern for implementing `DependencyProperty`: The `DocumentText` property should use the `GetValue`/`SetValue` methods, and not access a different backing store.

Problem

I have used AvalonEdit in my project that is based on WPF and MVVM. After reading this post I created the following class: ``` public class MvvmTextEditor : TextEditor, INotifyPropertyChanged { public static DependencyProperty DocumentTextProperty = DependencyProperty.Register("DocumentText", typeof(string), typeof(MvvmTextEditor), new PropertyMetadata((obj, args) => { MvvmTextEditor target = (MvvmTextEditor)obj; target.DocumentText = (string)args.NewValue; }) ); public string DocumentText { get { return base.Text; } set { base.Text = value; } } protected override void OnTextChanged(EventArgs e) { RaisePropertyChanged("DocumentText"); base.OnTextChanged(e); } public event PropertyChangedEventHandler PropertyChanged; public void RaisePropertyChanged(string info) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(info)); } } } ``` and used the following XAML to use this control: ``` <avalonedit:MvvmTextEditor x:Name="xmlMessage"> <avalonedit:MvvmTextEditor.DocumentText> <Binding Path ="MessageXml" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"> <Binding.ValidationRules> <local:XMLMessageValidationRule /> </Binding.ValidationRules> </Binding> </avalonedit:MvvmTextEditor.DocumentText> </avalonedit:MvvmTextEditor> ``` but the binding works `OneWay` and doesn't update my string property nor run validation rule. How can I fix binding to work as expected `TwoWay`?

Original source

Related problems