WPF IDataErrorInfo и текстовый редактор Avalon - PullRequest
0 голосов
/ 15 февраля 2019

Я использую текстовый редактор 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>

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

...