代码之家  ›  专栏  ›  技术社区  ›  Joseph Sturtevant

ValidationRule强制使用唯一名称

  •  1
  • Joseph Sturtevant  · 技术社区  · 16 年前

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

    2 回复  |  直到 16 年前
        1
  •  2
  •   Daniel Jennings    16 年前

    首先,我将创建一个简单的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>
    

        2
  •  1
  •   Patrick    7 年前

    只有当有其他属性要绑定到规则时,我才会创建一个自定义依赖对象。因为在本例中,我们所做的只是附加一个要检查的值集合,所以我 <UniqueValueValidationRule.OtherValues> 财产a <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>