提问人:Jeremy Deters 提问时间:11/9/2023 更新时间:11/9/2023 访问量:18
WPF - 当有多个控件出现验证错误时,验证修饰器无法正确定位
WPF - validation adorners do not position correctly when there multiple controls with validation errors
问:
我有一个使用 .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;
}
}
如果我在滚动后调整窗口大小,它会暂时修复装饰器的位置。但是一旦我再次滚动,我就会遇到同样的问题。
如果我将 TextBox 包装在它自己的 AdornerDecorator 中,我可以解决这个问题。但我的实际应用程序包含多个 UserControls,每个 UserControl 都有数百个不是从模板创建的唯一控件(TextBox、ComboBoxes、ToggleButton 等)。我不想更新我的 XAML 来添加更多的 AdornerDecorators,尤其是不要为每个控件添加一个。
这似乎是 .Net Framework (4.8) 中的一个错误。还有其他人有这个问题吗,你找到一个简单的解决方法了吗?
答: 暂无答案
评论