我正在尝试编写一个自定义 WPF ValidationRule 来强制某个属性在给定集合的上下文中是唯一的。例如:我正在编辑绑定到 ListView 的自定义对象的集合,我需要确保集合中每个对象的 Name 属性是唯一的。有谁知道如何做到这一点?
Joseph Sturtevant
问问题
1825 次
2 回答
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。
于 2008-08-29T18:03:51.427 回答
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>
于 2017-10-27T16:57:12.813 回答