2013-03-12 2 views
0

Я пытаюсь проверить ввод данных на DataGrid, который заполнен DataView (например, myDataGrid.ItemsSource = myDataView). Тем не менее, все примеры проверки WPF DataGrid, которые я видел, предполагают, что источником DataGrid является класс C#. Я не могу понять, как подключить одну ячейку (т. Е. Столбец) к проверке кода. Может ли кто-нибудь привести пример или указать мне его?Проверка WPF DataGrid при привязке к DataView

+0

Примеры, которые вы видели, вероятно, лучший путь вперед; вы уверены, что не хотите идти этим путем? WPF в целом полностью ориентирован на этот стиль, и идти против него обычно сложнее. –

+0

Я сомневаюсь, что тривиальным является назначение DataView в качестве источника данных для DataGrid, однако в этом сценарии действительно сложно выполнить проверку. – Conrad

ответ

0

Итак, я сделал еще несколько исследований, и в основном я отсутствовал что я могу указать имя столбца с атрибутом PathBinding (или даже использовать порядковый номер столбца в скобках, , напримерPath="[0]"). После этой реализации все в основном совпадает с использованием свойства класса. Поэтому типичное определение столбца DataGrid, которое я использую, следующее:

<DataGridTextColumn Header="Regular" EditingElementStyle="{StaticResource ValidationErrorStyleBoxRA}" ElementStyle="{StaticResource ValidationErrorStyleBlockRA}" Width="60"> 
    <DataGridTextColumn.Binding> 
     <Binding Path="HourlyRate" StringFormat="F3" ValidatesOnExceptions="True" ValidatesOnDataErrors="True" UpdateSourceTrigger="PropertyChanged"> 
      <Binding.ValidationRules> 
       <local:HourlyRatesAmountValidate ValidatesOnTargetUpdated="True" /> 
      </Binding.ValidationRules> 
     </Binding> 
    </DataGridTextColumn.Binding> 
</DataGridTextColumn> 
0

Хорошо, я сделал несколько быстрых тестов; Я думаю, что основным препятствием на самом деле делать это вручную является то, что DataGridCell не создает привязки для своего содержимого при непосредственном назначении DataView для отображения. Однако, если вы захотите перепрыгнуть через обручи при назначении пользовательских DataGridTemplateColumn s при создании DataGrid, вы можете получить доступ к связям, например, в экземплярах TextBox внутри шаблона, и установить на них специальные ошибки проверки.

На самом деле, это или переопределяет стиль по умолчанию для текстовых полей, сгенерированных DataGrid; вы видите, стиль текстового поля по умолчанию не имеет границ или чего-то еще, поэтому установка ошибки проверки на него не имеет никакого эффекта. Внедрение его в обычное текстовое поле с помощью DataTemplate или переопределение его стиля позволило бы фактически сделать что-то видимым как эффект установки ошибки проверки.

Однако вам нужно провести исследование самостоятельно; Я сделал быстрый прототип, и он работает, но я не могу правильно создать привязку в DataTemplate (либо я забыл все WPF, которые я знал с тех пор, как работал с ним последним, или я знаю только, как работать с соответствующими привязками :)) , Если вы куда-то с этим справитесь, то это будет проще:

Как-нибудь получите доступ к BindingExpression; я сделал привязку обработчика к событию LostFocus и проверил, был ли потерянный фокус текстовым полем, который находился внутри DataGridCell; если да, то я просто отметить, что связывание как недействительный (с t представляющий собой экземпляр TextBox):

var x = t.GetBindingExpression(TextBox.TextProperty); 

Validation.MarkInvalid(x, new ValidationError(new ExceptionValidationRule(), x.ParentBinding, "error", new Exception("error"))); 

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

Смежные вопросы