WPF — элементы оформления проверки позиционируются неправильно при наличии нескольких элементов управления с ошибками проверки.

У меня есть приложение WPF, созданное с помощью .NET Framework 4.8. У меня есть модель представления, которая реализует INotifyDataErrorInfo для проверки. В моем XAML я использую шаблон Validation.ErrorTemplate по умолчанию, но я также пробовал использовать собственный шаблон с теми же результатами.

Если у меня есть только несколько элементов управления с ошибками проверки, декораторы проверки WPF по умолчанию отображаются правильно. Если у вас много элементов управления с ошибками проверки, декораторы не всегда появляются вокруг AdornedElement.

Вот пример приложения, демонстрирующего проблему:

ВьюМодель.cs

      public  class ViewModel: INotifyPropertyChanged, INotifyDataErrorInfo
{
    private string _value;

    public string Value
    {
        get { return _value; }
        set
        {
            _value = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Value)));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public IEnumerable GetErrors(string propertyName)
    {
        return new[]{"Value cannot be null"};
    }

    public bool HasErrors
    {
        get
        {
            return string.IsNullOrEmpty(_value);
        }
    }

    public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
    
}

MainWindow.xaml<

      Window x:Class="ValidationErrorProblem.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ValidationErrorProblem"
        mc:Ignorable="d"
        Title="MainWindow" Height="800" Width="400">
    <Grid>
        <ScrollViewer HorizontalAlignment="Right">
            <ItemsControl x:Name="MyList">
                <ItemsControl.ItemTemplate>
                    <DataTemplate DataType="{x:Type local:ViewModel}">
                        <TextBox Margin="5" Text="{Binding Value}" Width="100"/>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </ScrollViewer>
    </Grid>
</Window>

MainWindow.xaml.cs

      public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        var items = new List<ViewModel>();
        for (var i = 0; i < 200; i++) items.Add(new ViewModel());
        MyList.ItemsSource = items;
    }
}

Вот как это выглядит при запуске приложения и начале прокрутки:

Если я изменю размер окна после прокрутки, это временно исправит расположение декоративных элементов. Но как только я снова прокручиваю, у меня возникает та же проблема.

Я могу это исправить, если оберну TextBox в отдельный AdornerDecorator. Но мое фактическое приложение содержит несколько UserControls, каждый из которых имеет сотни уникальных элементов управления (TextBoxes, ComboBoxes, ToggleButtons и т. д.), которые не созданы на основе шаблона. Я не хочу обновлять свой XAML, чтобы добавить больше AdornerDecorators, особенно по одному для каждого элемента управления.

Это похоже на ошибку в .Net Framework (4.8). Есть ли у кого-нибудь еще такая проблема, и нашли ли вы простое решение?

0 ответов

Другие вопросы по тегам