Начну с того, что я совершенно новичок в WPF.Но у меня есть 20-летний опыт разработки и около 5 лет опыта работы с веб-формами на C #.
Я пытаюсь диагностировать приложение WPF, использующее элемент управления DataGrid.
Я собираюсь попробоватьопишите сценарий, который происходит в этом приложении.
Вот шаги, которые приводят к «ошибке».Я пытаюсь выяснить, что происходит:
Пользователь добавляет строку в таблицу DataGrid.Пользователь изменяет первый столбец (Кол-во) на 1. Пользовательские вкладки в столбцах.Как только курсор пройдет столбец «Discount Pct» и войдет в следующий столбец.В этот момент ячейка «Discount Pct» выделяется красным.Другие ячейки нельзя редактировать, пока столбец «Discount Pct» не будет «исправлен».Самое смешное, что вы можете очистить ячейку и ввести те же данные, и красный цвет исчезнет.
Я подумал, может быть, это потому, что поле представляет собой поле «процент» (когда вы вводите .10, оно становится«10%», когда вы покидаете ячейку), но то же самое происходит с другим столбцом (простой текст / varchar).
Другие странные вещи, которые я заметил:
Если пользователь неничего не вводите в ячейку Qty, а просто вкладывайте прямо во все столбцы, до конца ни одна из ячеек не станет красной.
Если пользователь щелкает (вместо вкладки) ячейку Discount Pct (независимо от того, введено Qty или нет), затем покидает эту ячейку (щелчком или вкладкой), ячейка НЕ краснеет.
Есть идеи, что здесь происходит?Я полагаю, что какой-то тип проверки ячеек не прошел, но почему только при этих конкретных обстоятельствах?
Как бы вы диагностировали это?Могу ли я как-то отобразить ошибку проверки (я уверен, что должен быть обработчик, к которому я могу привязаться), может, это мне что-нибудь скажет.
Мысли?Идеи?
Добавление кода для запросов:
<DataGrid x:Name="myDataGrid"
ItemsSource="{Binding}"
CanUserAddRows="False"
CanUserDeleteRows="True"
CanUserResizeRows="False"
SelectionUnit="CellOrRowHeader"
ColumnHeaderStyle="{StaticResource lclDataGridColumnHeaders}"
RowHeaderStyle="{StaticResource lclDataGridRowHeaders}"
CellStyle="{StaticResource lclDataGridCellStyle}"
HorizontalGridLinesBrush="LightBlue"
VerticalGridLinesBrush="LightBlue"
AutoGeneratingColumn="DataGrid_AutoGeneratingColumn"
Loaded="DataGrid_Loaded"
LoadingRow="DataGrid_LoadingRow"
CurrentCellChanged="DataGrid_CurrentCellChanged"
CellEditEnding="DataGrid_CellEditEnding">
</DataGrid>
Я понял, как применить стиль к «EditCell», и воспользовался следующим (с другого сайта):
<Style x:Key="lclDataGridCellEditStyle" TargetType="{x:Type TextBox}">
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Padding" Value="0"/>
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors)[0].ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>
Затем я присвоил это EditingElementStyle на сетке данных (в коде позади).
Сгенерированная ошибка проверки (подтверждает мои подозрения): "Значение" 10% "не может быть преобразовано ".
Это имеет смысл, потому что он хочет, чтобы пользователь ввел" .10 "или что-то подобное (число с плавающей запятой / двойное число / десятичное число / и т.д.) ... без"% "(обрабатывая запись как char / text).
Проблема в том, что эта строка «импортируется» (копируется из другой таблицы) в DataGrid, и, следовательно, поле уже заполнено.Итак, как я могу заставить DataGrid просто принять «отображаемое значение» (перебирая термины и угадывая здесь) для «Редактировать значение»?
И почему только тогда, когда вы меняете Qty Cell и затем вкладкучерез него возникает ли эта ошибка валидации?
Подробнее о другом поле позже ... как только я "решу" это, я подозреваю, что решение будет аналогичным ...
Я могудать больше кода, но есть много.Я пытаюсь просто дать то, что необходимо.Если я смогу опубликовать другой код (например, AutoGeneratingColumn, который является очень простым), дайте мне знать!
Новая информация ... Я предполагаю причину, по которой красное поле отображается после изменения Qty, потому что это вызывает изменение строки, что делает проверку.И, чтобы исправить процентный сценарий, который я описал выше, похоже, мне нужно будет реализовать «конвертер», как описано здесь: http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx
Другое обновление ....
Это сработало,Я добавил конвертер в поле «Процент», и теперь все хорошо для этого.
Другое поле, которое вызывает у меня проблемы, - это «целочисленный» столбец, который допускает пустые значения.Когда запись импортируется, этот столбец имеет значение NULL, но очевидно, что DataGridTextColumn хочет, чтобы значения int не были NULL.Есть ли свойство, которое я могу установить, чтобы разрешить нули?Или мне просто нужно сделать другой конвертер для преобразования между ..um ... null (строка) и int ??LOL
Шейн