قاعدة التحقق من الصحة لفرض الاسم الفريد
-
09-06-2019 - |
سؤال
أحاول كتابة قاعدة التحقق من صحة WPF المخصصة لفرض أن خاصية معينة فريدة في سياق مجموعة معينة.على سبيل المثال:أقوم بتحرير مجموعة من الكائنات المخصصة المرتبطة بـ ListView وأحتاج إلى التأكد من أن خاصية الاسم لكل كائن في المجموعة فريدة من نوعها.لا أحد يعرف كيفية القيام بذلك؟
المحلول
أولاً، سأقوم بإنشاء فئة 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>
بعد ذلك، أثناء التحقق من الصحة، انظر إلى مجموعة خاصية BoundList الخاصة بـ ListToCheck لمعرفة العنصر الذي تقوم بالتحقق من صحته مقابله.إذا كان موجودًا هناك، فمن الواضح أنه سيُرجع نتيجة تحقق خاطئة.إذا لم يكن كذلك، يعود صحيحا.
نصائح أخرى
سأقوم فقط بإنشاء كائن تبعية مخصص إذا كانت هناك خصائص أخرى أرغب في ربطها بالقاعدة.نظرًا لأن كل ما نفعله في هذه الحالة هو إرفاق مجموعة واحدة من القيم للتحقق منها، فقد قمت بإعداد ملفي <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>