2008-08-29 19 views
1

Belirli bir özelliğin belirli bir koleksiyonun bağlamında benzersiz olduğunu zorunlu kılmak için özel bir WPF ValidationRule yazmaya çalışıyorum. Örneğin: ListView'e bağlı özel nesneler koleksiyonunu düzenliyorum ve koleksiyondaki her bir nesnenin Name özelliğinin benzersiz olduğundan emin olmalıyım. Bunu yapmayı bilen var mı? içinde, SonraBenzersiz Adı ​​Zorlamak için Doğrulama Kuralı

YourCollectionType ListToCheck { get; set; } 

: oluşturun ValidationRule türetilmiş sınıfı, Sonra

class YourCollectionType : DependencyObject { 

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

} 

bir özellik:

cevap

2

Birincisi, koleksiyonunuzu tutmak için basit DependencyObject sınıfı oluşturmak istiyorum senin doğrulamada Sonra

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

ListToCheck en BoundList tesisin coll bakmak: XAML bunu yapmak Doğrulama yaptığınız öğe için bölüm. Oradaysa, yanlış bir doğrulama sonucunu geri döndürün. Değilse, gerçek geri dönüş.

+1

, bağlayıcı sonuç Haklısın (DataContext'i miras görünmüyor) –

+0

her zaman sıfırdır. ValidationRule görsel ağacın bir parçası değildir ve bu nedenle DataContext'i devralmaz. Sorunu ve çözümlerini açıklayan güzel makaleler var [burada] (http://www.codeproject.com/KB/WPF/AttachingVirtualBranches.aspx) ve [burada] (http://www.codeproject.com/KB/ WPF/ArtificialInheritanceCxt.aspx). –

0

Kurallara bağlamak istediğim başka özellikler varsa, yalnızca özel bir bağımlılık nesnesi oluşturabilirim. Bu durumda yaptığımız tek şey kontrol etmek için tek bir değerler topluluğuna bağlanmasıdır, ben <UniqueValueValidationRule.OtherValues> mülkümü <CollectionContainer> yaptım.

Oradan

, gerçek bağlama tutun ve ona OtherValues sonra da bağlama kaynağı kullanabilen bir {StaticResource} anahtarı vermek için bir <CollectionViewSource> olması gereken miras olmamak DataContext, <TextBox.Resources> sorununa geçmiş olsun.

Doğrulama kuralı, daha sonra yalnızca OtherValues.Collection aracılığıyla döngüye ihtiyaç duyar ve eşitlik denetimleri gerçekleştirir.

gözlemleyin: Bu işe görünmüyor

<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> 
İlgili konular