Проверка при привязке данных в WPF - PullRequest
0 голосов
/ 01 февраля 2012

Я собрал приложение в WPF (MVVM) и добавил проверку. Вот мой результат:

enter image description here

Вы заметите красные сквайры вокруг текстовых полей ввода. Дело в том, что я не хочу сталкивать клиента с ошибкой проверки при запуске формы. При вводе данных или нажатии Отправить лучше всего.

Есть несколько похожих вопросов по SO, но они не нашли подходящего решения. (Сброс каждого элемента управления при инициализации не является решением)

Так что вопрос в том, как запустить форму и:

Вариант A: (легко) Сброс проверки

Вариант B: не вызывать проверку до тех пор, пока не будет привязана

Вариант C: Другое хорошее решение

Код загрузки:

здесь

Просмотр кода:

<Window x:Class="Validation.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="150" Width="250">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"></RowDefinition>
            <RowDefinition Height="auto"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="80"></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <!-- Name -->
        <Label Grid.Column="0" Grid.Row="0">Name</Label>
        <TextBox Grid.Column="1" Grid.Row="0"
                 Text="{Binding Model.Name, UpdateSourceTrigger=PropertyChanged,ValidatesOnDataErrors=True}"></TextBox>
        <!-- Age -->
        <Label Grid.Column="0" Grid.Row="1">Age</Label>
        <TextBox Grid.Column="1" Grid.Row="1"
                 Text="{Binding Model.Age, UpdateSourceTrigger=PropertyChanged,ValidatesOnDataErrors=True}"></TextBox>
        <!-- Submit/Cancel -->
        <StackPanel Grid.Column="1" Grid.Row="2" FlowDirection="LeftToRight">
            <Button>Cancel</Button>
            <Button>Submit</Button>
        </StackPanel>
    </Grid>
</Window>

Код модели представления:

public class FormViewModel
{
    #region constructors
    public FormViewModel()
    {
        Model = new FormModel();
    }
    #endregion

    #region properties
    public FormModel Model { get; set; }
    #endregion

}

Код модели:

   public class FormModel : INotifyPropertyChanged, IDataErrorInfo
    {
        #region notifypropertychanged
        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = this.PropertyChanged;
            if (handler != null)
            {
                var e = new PropertyChangedEventArgs(propertyName);
                handler(this, e);
            }
        }
        #endregion

        #region dataerrorinfo
        public string Error
        {
            get { return null; }
        }

        public string this[string columnName]
        {
            get
            {
                switch (columnName)
                {
                    case "Name":
                        if (string.IsNullOrEmpty(Name))
                        {
                            return "Name is required";
                        }
                        break;
                    case "Age":
                        if (Age < 18 || Age > 50)
                        {
                            return "Are you kidding?";
                        }
                        break;
                }
                return null;
            }
        }
        #endregion

        #region properties
        private string name;
        public string Name { get { return name; } set { name = value; OnPropertyChanged("Name"); } }

        private int age;
        public int Age { get { return age; } set { age = value; OnPropertyChanged("Age"); } }
        #endregion
    }

Решение (на данный момент)

enter image description here

<Style x:Key="InputControlDefault" TargetType="{x:Type TextBox}">
    <Setter Property="Validation.ErrorTemplate">
        <Setter.Value>
            <ControlTemplate>
                <DockPanel LastChildFill="True">
                    <TextBlock DockPanel.Dock="Right" 
                    Foreground="black"
                    FontSize="12pt">
                    ?
                    </TextBlock>
                    <AdornedElementPlaceholder/>
                </DockPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsEnabled" Value="false">
            <Setter Property="Foreground" Value="Black"/>
        </Trigger>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="ToolTip" Value="test"/>
            <Setter Property="BorderBrush" Value="Red" />
        </Trigger>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="Validation.HasError" Value="true"/>
                <Condition Property="Text" Value=""/>
            </MultiTrigger.Conditions>
            <Setter Property="BorderBrush" Value="Orange" />
            <Setter Property="Validation.ErrorTemplate">
                <Setter.Value>
                    <ControlTemplate>
                        <DockPanel LastChildFill="True">
                            <TextBlock DockPanel.Dock="Right" Foreground="Black" FontSize="12pt">
                                *
                            </TextBlock>
                            <AdornedElementPlaceholder/>
                        </DockPanel>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Setter Property="ToolTip" Value="test"/>
        </MultiTrigger>
    </Style.Triggers>
</Style>

1 Ответ

1 голос
/ 01 февраля 2012

Я отвечаю на аналогичный вопрос несколько дней назад:

first, если ваше правило гласит, что имя и фамилия не должны быть пустыми - Право, что пользователь видит ошибку проверки.

я использовал ValidationTemplate для пустых / начальных значений, поэтому что пользователь просто видит "*" для обязательного поля.

здесь полный ответ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...