принудительная валидация; WPF, DataGrid, ObservableCollection - PullRequest
7 голосов
/ 16 июня 2009

У меня есть WPF DataGrid. Я читаю CSV-файл и собираю ObservableCollection объектов. Я установил DataGrid.ItemsSource в коллекцию. Я хотел бы затем вызвать RowValidation для каждой строки в DataGrid. Если я, играющий пользователь, редактирую ячейку, запускается RowValidation, все хорошо. Но проверка не срабатывает при начальной загрузке. Есть ли способ, которым я могу позвонить ?? ValidateRow ?? на ряд? на каждом ряду? (C #, WPF, VS2008 и т. Д.)

Ответы [ 2 ]

2 голосов
/ 16 июня 2009

Для ваших привязок установите UpdateSourceTrigger на измененное свойство, а затем поместите в него свои правила проверки. По умолчанию триггер источника обновлений - «Потерянный фокус».

  <Binding Path="Name" UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <ExceptionValidationRule />
            </Binding.ValidationRules>
        </Binding>

Также, для другого хорошего решения, посмотрите здесь

http://www.codeproject.com/KB/WPF/wpfvalidation.aspx

Пол создает собственный поставщик ошибок, например

Вы можете вызвать метод Validate () для ErrorProvider для принудительной проверки, и проверьте, действительны ли элементы управления

1 голос
/ 16 декабря 2011

Вам нужно будет установить RowValidationRule и установить ValidationStep = "ConvertedProposedValue", если вы хотите, чтобы он проверялся после начальной загрузки ObservableCollection

        <DataGrid Name="dgCsvObjects"
            ItemsSource="{Binding Path=CsvObjects}"
            AutoGenerateColumns="False">
            <DataGrid.RowValidationRules>
                <Validation:MyObjectValidationRule ValidationStep="ConvertedProposedValue" />
            </DataGrid.RowValidationRules>
            <DataGrid.Columns>
                <DataGridTextColumn Header="Property1" Binding="{Binding Path=Property1}"  />
                <DataGridTextColumn Header="Property2" Binding="{Binding Path=Property2}"  />
                <DataGridTextColumn Header="Property3" Binding="{Binding Path=Property3}"  />
                <DataGridTextColumn Header="Property4" Binding="{Binding Path=Property4}"  />
            </DataGrid.Columns>
        </DataGrid>
...