WPF - 当有多个控件出现验证错误时,验证修饰器无法正确定位

WPF - validation adorners do not position correctly when there multiple controls with validation errors

提问人:Jeremy Deters 提问时间:11/9/2023 更新时间:11/9/2023 访问量:18

问:

我有一个使用 .NET Framework 4.8 构建的 WPF 应用程序。我有一个实现 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>

主窗口.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;
    }
}

以下是运行应用程序并开始滚动时的样子:enter image description here

如果我在滚动后调整窗口大小,它会暂时修复装饰器的位置。但是一旦我再次滚动,我就会遇到同样的问题。

如果我将 TextBox 包装在它自己的 AdornerDecorator 中,我可以解决这个问题。但我的实际应用程序包含多个 UserControls,每个 UserControl 都有数百个不是从模板创建的唯一控件(TextBox、ComboBoxes、ToggleButton 等)。我不想更新我的 XAML 来添加更多的 AdornerDecorators,尤其是不要为每个控件添加一个。

这似乎是 .Net Framework (4.8) 中的一个错误。还有其他人有这个问题吗,你找到一个简单的解决方法了吗?

WPF 验证装饰 错误模板 装饰器

评论


答: 暂无答案