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>

http://www.wpftutorial.net/DataValidation.html)

2 ответа

Решение

Я не уверен, что можно делать именно то, что вы хотите. Вы могли бы сделать это с большим количеством хитрости в установщиках свойств (я бы не стал полагаться на это, поскольку это потребовало бы изменения привязок, которые по определению являются динамическими), или с помощью кода позади / пользовательских элементов управления.

Вместо этого я предлагаю вам вставить свою проверку в вашу ViewModel, вероятно, с IDataErrorInfo, Есть много статей там. Вот один из первых, которые я нашел с поиском только для "MVVM проверки":

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, но я не уверен, будет ли это работать в каждом сценарии.

Другие вопросы по тегам