powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / проверка полей в MVVM
10 сообщений из 10, страница 1 из 1
проверка полей в MVVM
    #38072512
Вот такой вопрос новичка.
Сделано по шаблону MVVM, есть вью и для нее вью модель.
TextBoх на вью связан со свойством Height обьекта Map вью модели:
Код: xml
1.
<TextBox ... Text="{Binding Path = Map.Height, Mode = TwoWay}" ... />

Пусть свойство Height имеет тип double.

Когда я на форме в это поле ввожу неправильного формата значение, скажем строку "23/34", и перехожу на другой элемент, то граница текстового поля становится красной и при этом я могу редактировать другие элементы и в конце концов сохранить данные (при этом сохраняется предыдущее "правильное" число).

Вопрос - как лучше сделать так, чтобы при неправильном формате введенного значения и дальнейшей смене фокуса программа выводила сообщение и не давала редактировать другие элементы? Первое, что приходит в голову это в каждом элементе обработать событие потери фокуса и сделать проверку, но это уж очень криво, по-моему.
...
Рейтинг: 0 / 0
проверка полей в MVVM
    #38073191
Nicky_N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гуглите:
IDataErrorInfo
ValidationRule
...
Рейтинг: 0 / 0
проверка полей в MVVM
    #38075693
Nicky_N,

ок, спасибо, сделал через ValidationRule с выводом сообщения об ошибке:
Код: xml
1.
2.
3.
4.
5.
6.
7.
private void validationError(object sender, ValidationErrorEventArgs e)
{
    if (e.Action == ValidationErrorEventAction.Added)
    {
          MessageBox.Show(e.Error.ErrorContent.ToString(),"ops");
    }
}

Осталась пара вопросов.
Первый - у меня поле Map.Height имеет тип double? и я хочу, чтобы пустое значение в текстовом поле не считалось за ошибку и приводило к null в самом свойстве. Как этого добиться? Сейчас считает за ошибку.
...
Рейтинг: 0 / 0
проверка полей в MVVM
    #38076058
Nicky_N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проверка полей в MVVM,

как именно вы проверяете в ValidationRule?
...
Рейтинг: 0 / 0
проверка полей в MVVM
    #38076097
Nicky_N,

ну вот, например, делаю класс:
Код: c#
1.
2.
3.
4.
5.
6.
7.
public class DigitalValidationRule : ValidationRule
{
     public override ValidationResult Validate(object value, CultureInfo cultureInfo)
     {
           return new ValidationResult(true, null); 
     }
}

и для поля на форме:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
<TextBox Height="23" HorizontalAlignment="Left" Margin="113,80,0,0" Name="textBox2" VerticalAlignment="Top" Width="76" >
    <TextBox.Text>
        <Binding Path ="Map.Height" NotifyOnValidationError="true">
            <Binding.ValidationRules>
                <local:DigitalValidationRule />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>


для пустого поля, к которому прибинедно свойство типа double? у меня все равно получается ошибка. в этом случае мне хочется, чтобы свойиство становилось null.
...
Рейтинг: 0 / 0
проверка полей в MVVM
    #38076224
Nicky_N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проверка полей в MVVM,

Не понятно, в чем смысл вашего правила проверки: всегда возвращать положительный результат проверки?
...
Рейтинг: 0 / 0
проверка полей в MVVM
    #38076250
Nicky_

ну это просто пример, я убрал все лишнее. но даже с этим - проблема.
...
Рейтинг: 0 / 0
проверка полей в MVVM
    #38076320
Nicky_N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проверка полей в MVVM,

когда я задавал вопрос о том, как именно вы проверяете, я имел в виду код вашего класса "со всем лишним".
...
Рейтинг: 0 / 0
проверка полей в MVVM
    #38077061
Nicky_N,

я может не очень корректно задал последний вопрос, переформулировал его в соседнем топике. там проблема возникает даже если ничего специально не проверять.
...
Рейтинг: 0 / 0
проверка полей в MVVM
    #38077200
enigmatic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проверка полей в MVVM,

У меня получилось сделать это, но дополнительно пришлось использовать конвертер.
Тут еще есть нюанс: валидация срабатывает до вызова конвертера и это неудобно, но как сделать по-другому мне неизвестно (было бы удобнее, если бы конвертер в данном случае вызывался до валидатора).
См. код.

Валидатор
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    internal class MyValidationRule : ValidationRule {
        public override ValidationResult Validate(object value, CultureInfo cultureInfo) {
            if (value == null) return new ValidationResult(true, null);

            var stringValue = value.ToString();
            if (string.IsNullOrWhiteSpace(stringValue)) return new ValidationResult(true, null);

            double doubleValue;
            try {
                doubleValue = Convert.ToDouble(stringValue);
                return new ValidationResult(true, null);
            } catch {
                return new ValidationResult(false, "Failed!");
            }
        }
    }

Конвертер
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
    public class NullableDoubleConverter : IValueConverter {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
            return value;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
            return string.IsNullOrWhiteSpace(value.ToString()) ? null : (double?) System.Convert.ToDouble(value.ToString());
        }
    }

XAML
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
                <Binding Path="Property"
                         Mode="TwoWay"
                         UpdateSourceTrigger="PropertyChanged"
                         Converter="{StaticResource NullableDoubleConverter}">
                    <Binding.ValidationRules>
                        <local:MyValidationRule />
                    </Binding.ValidationRules>
                </Binding>

...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / проверка полей в MVVM
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]