WPF Listview:添加或删除数据绑定集合时强制验证
我正在尝试为ListView构建一个验证规则,该规则只有在其数据绑定集合上至少有一个项时才有效。我最终创建了一个新的ValidationRule派生类,如下所示:WPF Listview:添加或删除数据绑定集合时强制验证,wpf,validation,data-binding,wpf-controls,Wpf,Validation,Data Binding,Wpf Controls,我正在尝试为ListView构建一个验证规则,该规则只有在其数据绑定集合上至少有一个项时才有效。我最终创建了一个新的ValidationRule派生类,如下所示: public class NoEmptyCollectionValidationRule : ValidationRule { public override ValidationResult Validate(object value, CultureInfo cultureInfo) { var items
public class NoEmptyCollectionValidationRule : ValidationRule {
public override ValidationResult Validate(object value, CultureInfo cultureInfo) {
var items = (IEnumerable<Object>) value;
var valid = items != null && items.Any();
return new ValidationResult(valid, "oops");
}
}
不幸的是,即使每当我在数据绑定集合中添加或删除联系人时,CollectionChanged事件都被正确触发,但我的自定义验证规则只被调用一次(第一次触发事件)。例如,假设我从一个空联系人集合开始。通过“我的表单”添加项目最终会触发CollectionChanged事件,并且最终会调用我的自定义验证规则,并清除初始验证错误。但是,删除此新联系人和/或向集合中添加新联系人仍将触发CollectionChanged事件,但不再调用我的自定义验证规则
关于如何解决这个问题有什么线索吗
谢谢我认为这是因为WPF绑定验证基于标量值属性,而不是基于集合的属性 或许可以看看这种解决方案:
<ListView Name="_lContatos" Height="95"
SelectionMode="Single"
SelectedItem="{Binding SelectedContact}">
<ListView.ItemsSource>
<Binding Path="Contacts" Mode="TwoWay"
UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<utils:NoEmptyCollectionValidationRule
ErrorMessage="Lista de contactos não pode estar vazia."
ValidatesOnTargetUpdated="True" />
</Binding.ValidationRules>
</Binding>
</ListView.ItemsSource>
<ListView.View>
<GridView>
<GridViewColumn Header="Contato" DisplayMemberBinding="{Binding Value}" />
<GridViewColumn Header="Extensão" DisplayMemberBinding="{Binding Extension}"/>
<GridViewColumn Header="Tipo" DisplayMemberBinding="{Binding ContactKind}"/>
</GridView>
</ListView.View>
</ListView>
_viewModel.Contacts.CollectionChanged +=
(sender, e) => _lContatos
.GetBindingExpression(ItemsControl.ItemsSourceProperty)
.ValidateWithoutUpdate();