ValidationRules в шаблоне управления
У меня есть контроль, который наследует от текстового поля
public class MyTextBox : TextBox
Это имеет стиль
<Style TargetType="{x:Type Controls:MyTextBox}">
один из сеттеров
<Setter Property="Template">
Я хочу иметь возможность установить Binding.ValidationRules
к чему-то в шаблоне, таким образом затрагивая все экземпляры этого типа текстового поля. Поэтому я могу сделать текстовые поля для, скажем, Times, Dates, Numerics, почтовые / почтовые индексы... или все, что я хочу,
Я не хочу устанавливать правила проверки каждый раз, когда я создаю текстовое поле. Я просто хочу сказать, что я хочу NumericTextBox
и проверить его любым способом, установленным в шаблоне.
Это возможно?
Все, что я видел до сих пор, это то, что ValidationRules устанавливаются для каждого экземпляра элемента управления, например
<TextBox x:Name="txtEMail" Template={StaticResource TextBoxErrorTemplate}>
<TextBox.Text>
<Binding Path="EMail" UpdateSourceTrigger="PropertyChanged" >
<Binding.ValidationRules>
<local:RegexValidationRule Pattern="{StaticResource emailRegex}"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
2 ответа
Я не уверен, что можно делать именно то, что вы хотите. Вы могли бы сделать это с большим количеством хитрости в установщиках свойств (я бы не стал полагаться на это, поскольку это потребовало бы изменения привязок, которые по определению являются динамическими), или с помощью кода позади / пользовательских элементов управления.
Вместо этого я предлагаю вам вставить свою проверку в вашу ViewModel, вероятно, с IDataErrorInfo
, Есть много статей там. Вот один из первых, которые я нашел с поиском только для "MVVM проверки":
Это позволит вам использовать стандартные методы композиции ОО, так что вы можете избежать повторения:)
Как видите, правила проверки устанавливаются вместе с привязками. Я столкнулся с той же проблемой, и рабочим решением для меня было сделать что-то вроде этого:
public MyTextBox()
{
this.Loaded += new RoutedEventHandler(MyTextBox_Loaded);
}
void MyTextBox_Loaded(object sender, RoutedEventArgs e)
{
var binding = BindingOperations.GetBinding(this, TextBox.ValueProperty);
binding.ValidationRules.Add(new MyValidationRule());
}
Проблема здесь заключается в том, чтобы убедиться, что привязка установлена, прежде чем мы добавим правило проверки, следовательно, используем Loaded, но я не уверен, будет ли это работать в каждом сценарии.