Я использую текстовый редактор avalon в своем приложении MVVM
Поскольку его свойство Text не является привязываемым, я использую этот ответ , чтобы избежать проблемы
public sealed class AvalonEditBehaviour : Behavior<TextEditor>
{
public static readonly DependencyProperty ContentProperty =
DependencyProperty.Register("Content", typeof(string), typeof(AvalonEditBehaviour),
new FrameworkPropertyMetadata(default(string), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, PropertyChangedCallback));
public string Content
{
get { return (string)GetValue(ContentProperty); }
set { SetValue(ContentProperty, value); }
}
protected override void OnAttached()
{
base.OnAttached();
if (AssociatedObject != null)
AssociatedObject.TextChanged += AssociatedObjectOnTextChanged;
}
protected override void OnDetaching()
{
base.OnDetaching();
if (AssociatedObject != null)
AssociatedObject.TextChanged -= AssociatedObjectOnTextChanged;
}
private void AssociatedObjectOnTextChanged(object sender, EventArgs eventArgs)
{
var textEditor = sender as TextEditor;
if (textEditor != null)
{
if (textEditor.Document != null)
Content = textEditor.Document.Text;
}
}
private static void PropertyChangedCallback(
DependencyObject dependencyObject,
DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
{
var behavior = dependencyObject as AvalonEditBehaviour;
if (behavior.AssociatedObject != null)
{
var editor = behavior.AssociatedObject as TextEditor;
if (editor.Document != null)
{
var caretOffset = editor.CaretOffset;
if (dependencyPropertyChangedEventArgs.NewValue != null)
{
editor.Document.Text = dependencyPropertyChangedEventArgs.NewValue.ToString();
editor.CaretOffset = caretOffset;
}
}
}
}
}
И шаблон проверки XAML
<AdornerDecorator Grid.Row="0" Margin="5">
<avalonedit:TextEditor
Name="textEditor"
Validation.ErrorTemplate="{StaticResource ValidationTemplate}"
FontFamily="Consolas"
FontSize="10pt">
<i:Interaction.Behaviors>
<behaviours:AvalonEditBehaviour Content="{Binding Package.ActionJson, Mode=TwoWay, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}"/>
</i:Interaction.Behaviors>
</avalonedit:TextEditor>
</AdornerDecorator>
<ControlTemplate x:Key="ValidationTemplate">
<StackPanel>
<Border BorderBrush="Red" BorderThickness="3">
<AdornedElementPlaceholder/>
</Border>
<TextBlock Foreground="Red" FontSize="14" Text="{Binding [0].ErrorContent}"></TextBlock>
</StackPanel>
</ControlTemplate>
<Style TargetType="{x:Type avalonedit:TextEditor}">
<Setter Property="VerticalAlignment" Value="Stretch"/>
<!--the 'standard' template for rendering error messages as a tooltip-->
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors)/ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>
Он работал, когда я использовал стандартное текстовое поле, но несмотря на то, что код проверки срабатывает, когда я изменяю связанное свойство, я могуне смотрите ни красное поле вокруг текстового редактора, ни текстовый блок ошибки проверки, который должен идти ниже.