ValidationRules в шаблоне управления - PullRequest
5 голосов
/ 05 сентября 2011

У меня есть контроль, который наследует от текстового поля

public class MyTextBox : TextBox

Это стиль

<Style TargetType="{x:Type Controls:MyTextBox}">

один из Сеттеров

<Setter Property="Template">

Я хочу иметь возможность установить Binding.ValidationRules для чего-то в шаблоне, таким образом затрагивая все экземпляры этого типа текстового поля. Поэтому я могу сделать текстовые поля для, скажем, Времена, Даты, Числа, почтовые / почтовые индексы ... или все, что я хочу,

Мне не нужно устанавливать правила проверки каждый раз, когда я создаю текстовое поле. Я просто хочу сказать, что я хочу 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 ]

4 голосов
/ 05 сентября 2011

Как видите, правила проверки устанавливаются вместе с привязками.Я столкнулся с той же проблемой, и рабочим решением для меня было сделать что-то вроде этого:

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

1 голос
/ 06 сентября 2011

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

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

MVVM - Проверка

Это позволит вам использовать стандартную композицию OOтехники, чтобы вы могли избегать повторения :)

...