ValidationRule实施唯一名称

时间:2008-08-29 17:23:00

标签: wpf validation data-binding

我正在尝试编写自定义WPF ValidationRule来强制某个属性在给定集合的上下文中是唯一的。例如:我正在编辑绑定到ListView的自定义对象的集合,我需要确保集合中每个对象的Name属性是唯一的。有谁知道怎么做?

2 个答案:

答案 0 :(得分:2)

首先,我创建一个简单的DependencyObject类来保存你的集合:

class YourCollectionType : DependencyObject {

    [PROPERTY DEPENDENCY OF ObservableCollection<YourType> NAMED: BoundList]

}

然后,在ValidationRule派生类上,创建一个属性:

YourCollectionType ListToCheck { get; set; }

然后,在XAML中,执行以下操作:

<Binding.ValidationRules>
    <YourValidationRule>
       <YourValidationRule.ListToCheck>     
          <YourCollectionType BoundList="{Binding Path=TheCollectionYouWantToCheck}" />
       </YourValidationRule.ListToCheck>
    </YourValidationRule>
</Binding.ValidationRules>

然后在验证中,查看ListToCheck的BoundList属性的集合,以查找您要验证的项目。如果它在那里,显然会返回错误的验证结果。如果不是,请返回true。

答案 1 :(得分:1)

如果我想要绑定到规则的其他属性,我只会创建一个自定义依赖项对象。因为在这种情况下,我们所做的只是附加一个值集合以进行检查,我将<UniqueValueValidationRule.OtherValues>属性设为<CollectionContainer>

从那里开始,为了解决DataContext未被继承的问题,<TextBox.Resources>需要<CollectionViewSource>来保存实际绑定并为其提供{StaticResource}密钥,OtherValues可以将其用作绑定源。

验证规则本身只需循环通过OtherValues.Collection并执行相等检查。

观察:

    <TextBox>
        <TextBox.Resources>
            <CollectionViewSource x:Key="otherNames" Source="{Binding OtherNames}"/>
        </TextBox.Resources>
        <TextBox.Text>
            <Binding Path="Name">
                <Binding.ValidationRules>
                    <t:UniqueValueValidationRule>
                        <t:UniqueValueValidationRule.OtherValues>
                            <CollectionContainer Collection="{Binding Source={StaticResource otherNames}}"/>
                        </t:UniqueValueValidationRule.OtherValues>
                    </t:UniqueValueValidationRule>
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
    </TextBox>