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

有帮助吗?

解决方案

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

其他提示

如果我想将其他属性绑定到规则,我只会创建自定义依赖项对象。由于在这种情况下,我们所做的只是附加一个值集合来检查,我做了我的 <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>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top