WPF Listview:添加或删除数据绑定集合时强制验证

时间:2013-05-23 12:33:37

标签: wpf validation data-binding wpf-controls

我正在尝试为ListView构建验证规则,该规则仅在其数据绑定集合中至少有一个项目时才有效。我最终创建了一个新的ValidationRule派生类,如下所示:

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");
    }
}

以下是我在ListView上使用它的方法:

<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>

不幸的是,只有在用新的集合替换集合时,这才有效。除了这个场景,我还需要介绍另一个:当有人从ListView的数据绑定集合中添加或删除项目时,我需要评估我的验证规则。我曾想过拦截CollectionChanged事件(它是一个ObservableCollection)。理论上,我应该能够通过调用ValidateWithoutUpdate方法来强制评估我的规则:

_viewModel.Contacts.CollectionChanged +=
    (sender, e) => _lContatos
        .GetBindingExpression(ItemsControl.ItemsSourceProperty)
        .ValidateWithoutUpdate();

不幸的是,即使每次从数据绑定集合中添加或删除联系人时都正确地触发了CollectionChanged事件,我的自定义验证规则也只调用一次(第一次触发事件)。例如,假设我从一个空的联系人集合开始。通过我的表单添加项目最终会触发CollectionChanged事件,我的自定义验证规则最终会被调用,并且初始验证错误被清除。但是,删除此新联系人和/或向集合中添加新联系人仍会触发CollectionChanged事件,但不再调用我的自定义验证规则。

关于如何解决这个问题的任何线索?

由于

1 个答案:

答案 0 :(得分:-1)

我认为这是因为WPF绑定验证基于标量值属性而不是基于集合的属性。

也许看看这种解决方案:https://blogs.msdn.microsoft.com/codefx/2012/05/16/sample-of-may-16th-wpf-listbox-validation/