2015-10-15 19 views
14

Với một bộ chuyển đổi, tôi có thể phân biệt giữa ít nhất 4 loại hành vi liên quan đến việc cập nhật giá trị nguồn:WPF: Validation vs chuyển đổi

  • chuyển đổi một giá trị thích hợp (-> nguồn cập nhật)
  • rỗng trở lại (-> chỉ ra lỗi)
  • ném một ngoại lệ và kích hoạt quy tắc xác nhận ngoại lệ (-> chỉ ra lỗi)
  • trở Binding.DoNothing (-> không cập nhật nguồn, nhưng không chỉ ra eiter lỗi)

Với ValidationRule, tôi chỉ có thể phân biệt giữa thành công (-> nguồn cập nhật) và thất bại (-> không cập nhật nguồn), nhưng tôi không thể mô phỏng các hành vi được liên kết với Binding.DoNothing

Có cách sử dụng ValidationRule theo cách tương tự như hành vi của Binding.DoNothing của trình chuyển đổi?

+0

Bạn có muốn gắn kết không được cập nhật và kiểu phần tử ui không bị thay đổi? –

Trả lời

8

Ý định của Trình biến đổi và ValidationRules khá khác nhau. Người chuyển đổi lấy một giá trị và biến nó thành một giá trị khác. 4 trường hợp bạn đề cập là đủ phổ biến để chuyển đổi: làm điều đó; nói nó là null; thổi lên; bỏ qua. Tuy nhiên ValidationRules là có/không có thứ gì - chúng hợp lệ hoặc không. Mặc dù có thể có tùy chọn "bỏ qua" nhưng không có tùy chọn nào.

Ngữ nghĩa gần nhất sẽ là đặt IsValid = true trong hàm tạo, nhưng nó không chính xác những gì bạn muốn.

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); 
} 

Tư tưởng cuối cùng là nếu bạn cần trường hợp đặc biệt và thử hoặc bắt hoặc logic khác sẽ phát nổ. Điều duy nhất tôi có thể nghĩ đến là kiểm tra kiểu trong ValidationRule, điều này khá đáng ngờ vì bạn đang tạo ra một sự phụ thuộc không mong muốn, nhưng sẽ bỏ qua các vấn đề. tức là

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

HTH!

CẬP NHẬT

Hoặc làm thế nào về một 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

Trong trường hợp nào nó có ý nghĩa để bỏ qua một ValidationRule? – Domysee

Các vấn đề liên quan