WPF DataGrid с текстовым полем в столбце шаблона, свойство обжига не изменено - PullRequest
0 голосов
/ 14 июня 2011

У меня есть таблица данных со столбцом шаблона, и в этом шаблоне есть текстовое поле. Он связан со свойством «Количество» объекта в коллекции, из которой состоит источник. Количество является целым числом. Когда я добавляю элемент в сетку данных, я добавляю обработчик события в событие PropertyChanged элемента:

EnteredPart.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(p_PropertyChanged);

Это прекрасно работает, когда пользователь вводит целое число в текстовое поле ... Срабатывает обработчик p_PropertyChanged, и я могу отключить кнопки и при необходимости изменить количество. Когда пользователь вводит нецелое число, обработчик не вызывается, я просто получаю красный контур вокруг текстового поля. Из-за этого я не могу отключить необходимые кнопки, когда это необходимо (их следует отключить, если количество не разрешено). Можно ли как-нибудь с этим что-то сделать?

РЕДАКТИРОВАТЬ: Я попытался изменить свойство Количество на строку, и это вызвало вызов обработчика измененного свойства при вводе нецелых значений. Однако затем я добавил проверку в текстовое поле, чтобы проверить это, и если метод Validate возвращает значение false, обработчик измененного свойства снова перестает работать. Есть ли вообще способ получать уведомления как о проверке, так и об изменении свойства ??

РЕДАКТИРОВАТЬ 2: Вот еще один случай этой проблемы у меня в другом месте. У меня есть форма для добавления / редактирования телефонных номеров. Текстовое поле номера телефона выглядит так:

  <TextBox >
       <TextBox.Text>
           <Binding Path="Phone.Number">
               <Binding.ValidationRules>
                   <local:PhoneValidationRule />
               </Binding.ValidationRules>
           </Binding>
       </TextBox.Text>
   </TextBox>

После нажатия кнопки сохранения мне нужно проверить в моей модели просмотра, является ли число действительным, потому что если это не так, я не хочу запускать команду сохранения. Тем не менее, не похоже, что есть какой-либо способ сделать это, потому что если проверка не удалась, свойство Phone.Number имеет нулевое значение, и у меня нет возможности проверить, нужно ли мне запускать команду сохранения. Мне либо нужен доступ к состоянию ошибки (которое, как я думал, будет работать с помощью Validation.GetErrors, но не работает), либо к фактическому тексту в текстовом поле, который недоступен в модели представления.

1 Ответ

0 голосов
/ 16 июня 2011

Только для записи, проверка в части View имеет много недостатков, если вы находитесь в архитектуре MVVM.

Вы бы попробовали здесь проверить содержимое вашей модели в представлении: поэтому вы сломаетеАрхитектура MVVM путем вызова вашей модели в представлении.

Использование IDataErrorInfo поможет вам выполнить основную задачу MVVM (т.е. четко разделить три части).

Просто пример:

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

...