Порядок проверки для всей формы элементов управления - PullRequest
0 голосов
/ 12 сентября 2011

Я изучаю этот материал wpf и пытаюсь понять, как проверять элементы управления.В частности, я ищу это ...

  1. Форма может иметь 100 элементов управления (преувеличение, но возможно).Макет и поток формы представляют собой определенный порядок (с помощью последовательности вкладок для пользователя).Пользователь никогда не может получить доступ к некоторым «обязательным» полям и нажать кнопку «Сохранить».Как я могу запустить его, чтобы все элементы управления принудительно инициировали свои собственные соответствующие события «Проверка».

  2. Исходя из вышеизложенного, среда WPF обрабатывает правила проверки в том порядке, в котором пользовательсмотря на.Если нет, то как это можно контролировать, чтобы соответствовать потоку ввода данных вместо того, чтобы прыгать в последовательном порядке, в котором приложение создает объекты и соответствующие им правила проверки.

  3. Есть ли способчтобы ВСЕ отказавшие элементы управления срабатывали для поведения по умолчанию, заключающегося в том, что вместо сбойного элемента управления вместо красной надписи помещается красная рамка.

Спасибо

Ответы [ 2 ]

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

Заставьте ваш объект данных реализовать IDataErrorInfo, который будет выполнять проверку свойства для свойства, когда пользователь изменяет его, а затем использовать следующий стиль, чтобы применить красную рамку к элементам управления, которые имеют ошибку проверки:

<!-- ValidatingControl Style -->
<Style TargetType="{x:Type FrameworkElement}" x:Key="ValidatingControl">
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="True">
            <Setter Property="ToolTip" Value="{Binding 
                Path=(Validation.Errors)[0].ErrorContent, 
                RelativeSource={x:Static RelativeSource.Self}}" />
        </Trigger>
    </Style.Triggers>
</Style>

Это будет

  1. Выполнять проверку правильности только для одного свойства при изменении этого свойства
  2. Только (и всегда) отображать красную границу ошибки проверки для элементов управления, которыепривязан к недопустимому свойству

Редактировать

Вот пример того, как я могу реализовать проверку объекта:

public class MyObject : ValidatingObject
{
    public MyObject()
    {
        // Add Properties to Validate here
        this.ValidatedProperties.Add("SomeNumber");
    }

    // Implement validation rules here
    public override string GetValidationError(string propertyName)
    {
        if (ValidatedProperties.IndexOf(propertyName) < 0)
        {
            return null;
        }

        string s = null;

        switch (propertyName)
        {
            case "SomeNumber":
                if (SomeNumber <= 0)
                    s = "SomeNumber must be greater than 0";
                break;
        }

        return s;
    }

}

А мой базовый класс ValidatingObject, который реализует IDataErrorInfo, обычно содержит следующее:

#region IDataErrorInfo & Validation Members

/// <summary>
/// List of Property Names that should be validated
/// </summary>
protected List<string> ValidatedProperties = new List<string>();

public abstract string GetValidationError(string propertyName);

string IDataErrorInfo.Error { get { return null; } }

string IDataErrorInfo.this[string propertyName]
{
    get { return this.GetValidationError(propertyName); }
}

public bool IsValid
{
    get
    {
        return (GetValidationError() == null);
    }
}

public string GetValidationError()
{
    string error = null;

    if (ValidatedProperties != null)
    {
        foreach (string s in ValidatedProperties)
        {
            error = GetValidationError(s);
            if (error != null)
            {
                return error;
            }
        }
    }

    return error;
}

#endregion // IDataErrorInfo & Validation Members
1 голос
/ 12 сентября 2011

Как правило, чтобы выполнить то, что вы ищете, вы используете шаблон типа MVVM.Это означает, что вы привязываете каждый элемент управления, который собирает данные в вашей форме WPF, к вспомогательному полю или свойству.Вы добавляете проверку в привязку со стилем, который вызовет красную рамку.Для элементов управления с необходимыми данными часть проверки заключается в том, что они заполнены. Вы можете определить одно правило проверки для этого, называемое «ValidWhenHasData» или что-то подобное.

Чтобы заставить проверки срабатывать только при нажатии«сохранить» или тому подобное, есть несколько способов сделать это.Я обычно делаю свойство в каждом правиле проверки с именем «IsEnabled» и по умолчанию устанавливаю его в false;если установлено значение false, правило проверки всегда возвращает действительное.Затем я добавляю в код позади элементов управления, которые я хочу проверить.Когда нажата кнопка «сохранить», я просматриваю список и устанавливаю для всех правил проверки IsEnabled значение true, очищаю все ошибки в элементах управления в списке и затем обновляю привязку для каждого из них.Это отобразит красные прямоугольники на тех, которые не заполнены, или на том, что вы определили как условие ошибки.Вы также можете использовать этот список, чтобы установить фокус на первый элемент управления, который не прошел проверку, в выбранном вами порядке.

Пример шаблона элемента управления проверкой, который содержит заполнитель для всплывающей подсказки об ошибке проверки:

<ControlTemplate x:Key="errorTemplate">
    <Canvas Width="{Binding Path=AdornedElement.ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Adorner}}}" Height="{Binding Path=AdornedElement.ActualHeight, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Adorner}}}">
        <Border BorderBrush="Red" BorderThickness="1">
            <AdornedElementPlaceholder/>
        </Border>
        <Border Canvas.Top="-5" Canvas.Right="-5" BorderBrush="Gray" BorderThickness="1" >
            <TextBlock x:Name="errorBlock" TextAlignment="Center" Background="Red" Foreground="White" Width="10" Height="10" FontSize="9" ctl:valTooltip.MessageBody="{Binding Path=AdornedElement.(Validation.Errors)[0].ErrorContent,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Adorner}}}">*</TextBlock>
        </Border>
    </Canvas>
</ControlTemplate>

Пример привязки проверки:

<TextBox x:Name="TBNumItems" Margin="2,2,2,2" MinWidth="40" HorizontalAlignment="Left" Validation.ErrorTemplate="{StaticResource errorTemplate}">
    <TextBox.Text>
        <Binding x:Name="NumItemsBinding" Path="NumItems" NotifyOnSourceUpdated="True" UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <cal:UIntValidationRule x:Name="NumItemsValidationRule" MinValue="1" MaxValue="99999" IsEnabled="False"/>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

Пример кода для проверки:

/// <summary>
/// Clears all validation errors
/// </summary>
void ClearAllValidationErrors()
{
    Validation.ClearInvalid(TBNumItems.GetBindingExpression(TextBox.TextProperty));
}


/// <summary>
///  Revalidates everything
/// </summary>
void RevalidateAll()
{
    ClearAllValidationErrors();

    TBNumItems.GetBindingExpression(TextBox.TextProperty).UpdateSource();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...