Я пытаюсь обобщить образец, предоставленный Microsoft, иллюстрирующий, как реализовать проверку привязки [https://docs.microsoft.com/en-us/dotnet/framework/wpf/data/how-to-implement-binding-validation#see-also], переформулировав все это на C#.
(1) Я пытаюсь преобразовать следующую привязку XAML к C#:
<TextBox Name = "textBox1" Width = "50" FontSize = "15"
Validation.ErrorTemplate = "{StaticResource validationTemplate}"
Style = "{StaticResource textBoxInError}"
Grid.Row = "1" Grid.Column = "1" Margin = "2">
<TextBox.Text>
<Binding Path = "Age" Source = "{StaticResource ods}"
UpdateSourceTrigger = "PropertyChanged" >
<Binding.ValidationRules>
<c:AgeRangeRule Min = "21" Max = "130"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
(2) и следующий XAML, который создает красный восклицательный знак, чтобы уведомить пользователя об ошибке проверки на C#:
<ControlTemplate x:Key = "validationTemplate">
<DockPanel>
<TextBlock Foreground = "Red" FontSize = "20">!</TextBlock>
<AdornedElementPlaceholder/>
</DockPanel>
</ControlTemplate>
(3) также XAML, который создает всплывающую подсказку для C#, которая показывает, что создается сообщение об ошибке:
<Style x:Key = "textBoxInError" TargetType = "{x:Type TextBox}">
<Style.Triggers>
<Trigger Property = "Validation.HasError" Value = "true">
<Setter Property = "ToolTip"
Value = "{Binding RelativeSource = {x:Static RelativeSource.Self},
Path=(Validation.Errors)[0].ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>
Моя цель - сделать его многоразовым во многих местах, определив класс, который может создавать / определять как текстовое поле, так и привязку в моей программе для подключения текстовых полей к свойствам целочисленного или двойного типа. Хотя аналогичный вопрос задавался до [WPF C# как создать ЭТУ привязку в коде?, в этом случае код XAML для определения привязки и вспомогательных утилит / методов довольно сложен.
Мы будем благодарны за любые комментарии, предложения или помощь.
i.konuk
Вы уже на правильном пути, используя ValidationRule - не пытайтесь преобразовать все это на C#, потому что вам это не нужно. Определите глобальный стиль, который вы можете применить к TextBox, и придерживайтесь связанного правила проверки. Проверьте это сообщение в блоге, чтобы узнать, помогает ли это.
slugster, большое спасибо за предложение и поддержку. Надо было подумать о стиле! Я постараюсь опубликовать обновление, если у меня будет прогресс.





UserControl - отличный вариант.