2008-08-29 57 views
1

我正在嘗試編寫一個自定義的WPF ValidationRule來強制某個屬性在給定集合的上下文中是唯一的。例如:我正在編輯綁定到ListView的自定義對象的集合,我需要確保集合中每個對象的Name屬性都是唯一的。有誰知道如何做到這一點?ValidationRule爲了實現唯一名稱

回答

2

首先,我想創建一個簡單的DependencyObject類來保存您的收藏:

class YourCollectionType : DependencyObject { 

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

} 

然後,在您的有效性規則派生類,創建一個屬性:

YourCollectionType ListToCheck { get; set; } 

然後,在XAML,請執行以下操作:

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

然後在您的驗證中,查看ListToCheck的BoundList屬性的coll您正在驗證的項目。如果它在那裏,顯然返回一個錯誤的驗證結果。如果不是,則返回true。

+1

這似乎並不工作,綁定結果總是空(似乎並沒有繼承的DataContext) – 2010-05-04 05:46:29

0

我只會創建一個自定義依賴項對象,如果有其他屬性我想綁定到規則。因爲在這種情況下,我們所做的只是附加一組值來檢查,我讓我的<UniqueValueValidationRule.OtherValues>屬性爲<CollectionContainer>

從那裏,讓過去有<CollectionViewSource>持有實際的結合,並給它一個{StaticResource}關鍵,這OtherValues可再使用的綁定源所需的DataContext沒有被繼承,<TextBox.Resources>的問題。

然後驗證規則本身只需循環通過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>