Это может быть предполагаемая функциональность, но она мне кажется ошибкой.
Я использую готовую WPF DataGrid, привязанную к ObservableCollection и пытающуюся использовать некоторые правила проверки, чтобы обеспечить хорошую обратную связь с пользователем.Само собой разумеется, есть больше проблем, чем я могу сосчитать, но я остановлюсь на немедленном.
Вот краткое изложение проблемы:
- Привязать
ItemsSource
свойство кObservableCollection<T>
- Заполнить коллекцию
- Редактировать элемент в сетке таким образом, что это приведет к ошибке проверки
- Программно удалить этот элемент из
ObservableCollection<T>
Когда эти шаги выполнены, GridView правильно распознает, что элемент был удален из коллекции, и удаляет строку из сетки.Тем не менее, Сетка теперь застряла в недопустимом состоянии, и никакие дальнейшие действия не могут быть выполнены с помощью пользовательского интерфейса на Сетка!
Опять же, для меня это очень большая ошибкавозможность программно удалять предметы из коллекции - это большое дело.
Кто-нибудь сталкивался с этим?Любые предложения о том, как обойти это?
Стоит отметить, что я создал отдельное решение, просто чтобы изолировать эту проблему, но чтобы ответить на некоторые вопросы, которые могут у вас возникнуть:
Ваш объект реализует INotifyPropertyChanged
? ДА
Это пользовательская коллекция? Нет старого простого ObservableCollection<T>
Как вы удаляете элементы из своей коллекции?
//Find any newly added item and remove it
var someObject = SomeObjects
.Where(obj => obj.SomeProperty == SomeValue)
.First();
SomeObjects.Remove(someObject );
Как вы связываете свое правило проверки?
<DataGridTextColumn Header="SomeProperty">
<DataGridTextColumn.Binding>
<Binding Path="SomeProperty">
<Binding.ValidationRules>
<val:RequiredValidator ValidationStep="ConvertedProposedValue"
ValidatesOnTargetUpdated="True" />
</Binding.ValidationRules>
</Binding>
</DataGridTextColumn.Binding>
</DataGridTextColumn>
Как выглядит ваше правило проверки?
public class RequiredValidator : ValidationRule
{
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
if (value == null || String.IsNullOrWhiteSpace(value as String))
return new ValidationResult(false, "Field is required!");
return ValidationResult.ValidResult;
}
}