Я должен показать список, где каждый элемент будет проверен. Я подписан на Validation.ErrorEvent
на верхнем уровне для наблюдения за детьми.
Когда я удаляю элемент с ошибкой проверки из списка, это событие не возникает.
В приведенном ниже примере у меня есть 3 TextBox
на экране, каждый привязан к int
свойству. Ввод неправильного значения вызовет событие (Title
будет изменено на "+"
), после исправления значения событие будет инициировано один раз (Title
будет изменено на "-"
).
Однако при удалении TextBox
при наличииошибка не будет возникать событие (для очистки) и Title
остаться "+"
:
Как я могу это исправить? В идеале я хочу, чтобы это событие автоматически вызывалось до того, как произойдет удаление.
Обратите внимание: в реальном проекте существует сложная иерархия моделей представлений, такие решения, как «установить Title
в методе удаления», требуют мониторинга для подчиненных. просматривает и распространяет эту информацию по всей иерархии, чего я хотел бы избежать. Я бы предпочел решение только для просмотра.
MCVE:
public partial class MainWindow : Window
{
public ObservableCollection<VM> Items { get; } = new ObservableCollection<VM> { new VM(), new VM(), new VM() };
public MainWindow()
{
InitializeComponent();
AddHandler(Validation.ErrorEvent, new RoutedEventHandler((s, e) =>
Title = ((ValidationErrorEventArgs)e).Action == ValidationErrorEventAction.Added ? "+" : "-"));
DataContext = this;
}
void Button_Click(object sender, RoutedEventArgs e) => Items.RemoveAt(0);
}
public class VM
{
public int Test { get; set; }
}
xaml:
<StackPanel>
<ItemsControl ItemsSource="{Binding Items}" Height="200">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBox Text="{Binding Test, NotifyOnValidationError=True, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<Button Content="Remove first" Click="Button_Click" />
</StackPanel>