Благодаря Bijington я вышел на правильный путь и нашел ответ, который удовлетворяет MVVM, а также не нуждается в коде позади.В случае, если кто-то заинтересован, вот мое решение этой проблемы.
Ошибка, показанная выше, создается в представлении, потому что в WPF нет конвертера из букв в int (каким он должен быть).Чтобы поднять эту проблему, привязка должна иметь NotifyOnValidationError = True .
<TextBox Text="{Binding Path=SelectedItem.Punkte_Seite_max, UpdateSourceTrigger=PropertyChanged, NotifyOnValidationError=True}"
Это вызывает всплеск Validation.Error событие, которое может быть захвачено в любом месте дерева.Я решил захватить его с помощью перенаправленного триггера событий, например: XAML:
<Window
...
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" >
<i:Interaction.Triggers>
<userInterface:RoutedEventTrigger RoutedEvent="{x:Static Validation.ErrorEvent}" >
<userInterface:ViewErrorCounterAction ViewErrorCounter="{Binding Path=ViewValidationErrorCount, Mode=TwoWay}"/>
</userInterface:RoutedEventTrigger>
</i:Interaction.Triggers>
Таким образом, привязка к twoway - это MVVM-okayish ссылка на мою модель представления.
ViewErrorCounterAction основан на этот ответ SO :
public class ViewErrorCounterAction : TriggerAction<DependencyObject> {
public ViewErrorCounterAction()
{
ViewErrorCounter = 0; // initalize with 0 as there should not be such errors when the window is loaded
}
public int ViewErrorCounter
{
get
{
return System.Convert.ToInt32(GetValue(ViewErrorCounterProperty));
}
set
{
SetValue(ViewErrorCounterProperty, value);
}
}
public static readonly DependencyProperty ViewErrorCounterProperty = DependencyProperty.Register("ViewErrorCounter", typeof(int), typeof(ViewErrorCounterAction), new PropertyMetadata(null));
protected override void Invoke(object parameter)
{
var e = (ValidationErrorEventArgs)parameter;
if ((e.Action == ValidationErrorEventAction.Added))
ViewErrorCounter = ViewErrorCounter + 1;
else if ((e.Action == ValidationErrorEventAction.Removed))
ViewErrorCounter = ViewErrorCounter - 1;
}
}
Окончательно перенаправленный триггер события основан на https://sergecalderara.wordpress.com/2012/08/23/how-to-attached-an-mvvm-eventtocommand-to-an-attached-event/
Надеюсь, это поможет, и яБуду признателен за комментарии о том, как лучше решить эту проблему, если есть более элегантные способы:)