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). Есть ли у кого-нибудь еще такая проблема, и нашли ли вы простое решение?