2015-10-15 53 views
14

隨着轉換器,我可以關於源值的更新的至少4種類型的行爲之間進行區分:WPF:驗證與轉換器

  • 轉換爲適當的值( - >更新源)
  • 返回null( - >表示錯誤)
  • 拋出一個異常,並激活異常驗證規則( - >表示錯誤)
  • 返回Binding.DoNothing( - >不更新源,但不表示錯誤eiter)

隨着ValidationRule,我只能成功區分( - >更新源)和失效( - >不更新源),但我無法模擬出與Binding.DoNothing

相關聯的行爲是否有以類似於轉換器的Binding.DoNothing行爲的方式使用ValidationRule的方法?

+0

是否要綁定未更新,並且ui元素的樣式未更改? –

回答

8

Converters和ValidationRules的意圖很不相同。轉換器獲取一個值並將其轉換爲另一個值。你提到的4個案例足以用於轉換:做到這一點;說它是空的;爆炸;忽視。然而,ValidationRules是/不是事物 - 它們是有效的或不是。雖然有一個「忽略」選項是有道理的,但沒有一個。

最接近的語義是在構造函數中設置IsValid = true,但它不完全是你想要的。

public override ValidationResult Validate(object value, CultureInfo cultureInfo) 
{ 
    try 
    { 
     // try normal setup/validation 
    } 
    catch 
    { 
     // handle exceptions, return false 
    } 
    // decide if you want to return false 
    // return true (equivalent to nothing/ignore) 
    return new ValidationResult(true, null); 
} 

最後想到的是,如果您需要特殊情況,並且try-catch或其他邏輯會爆炸。唯一我能想到的是在ValidationRule中進行類型檢查,由於您正在創建一個不需要的依賴項,所以這很可疑,但會繞過這些問題。即

if (value is SpecialType) 
{ 
    return new ValidationResult(true, null); 
} 

HTH!

修訂

或者怎麼樣的IgnorableValidationRule

public class IgnorableValidationRule : ValidationRule 
{ 
    public bool Ignore { get; set; } = false; 

    public override ValidationResult Validate(object value, CultureInfo cultureInfo) 
    { 
     if (Ignore) return new ValidationResult(true, null); 

     return new ValidationResult(false, "Why does everyone ignore me?"); 
    } 
} 

<TextBox.Text> 
    <Binding Path="Data"> 
     <Binding.ValidationRules> 
      <local:IgnorableValidationRule Ignore="True"/> <!-- na na --> 
     </Binding.ValidationRules> 
    </Binding> 
</TextBox.Text> 
+1

在哪種情況下忽略ValidationRule會有意義? – Domysee