2008-11-05 34 views
28

Chỉ cần tự hỏi những gì mọi người nghĩ là thực hành tốt nhất khi thực hiện một IValueConverter mà không có một thực hiện ConvertBack ý nghĩa (hoặc một trong đó chỉ được sử dụng như OneWay)?Thực hành tốt nhất khi không thực hiện IValueConvert.ConvertBack

Nếu nó ném (và trong trường hợp đó là ngoại lệ), trả lại null hoặc trả lại một số giá trị mặc định.

Suy nghĩ?

Trả lời

40

Tài liệu MSDN cho IValueConverter.ConvertBack đề nghị trả lại DependencyProperty.UnsetValue.

Công cụ gắn kết dữ liệu không bắt được ngoại lệ được ném bởi trình chuyển đổi do người dùng cung cấp. Bất kỳ ngoại lệ được ném bởi phương pháp ConvertBack hoặc bất kỳ ngoại lệ không bị bắt nào được ném bằng các phương thức gọi gọi phương thức ConvertBack, được xử lý dưới dạng lỗi thời gian chạy. Xử lý các sự cố được mong đợi bằng cách trả lại DependencyProperty.UnsetValue.

4

Theo Microsoft, bạn nên quay lại DependencyProperty.UnsetValue

3

Khi ConvertBack chứa không có chức năng, và bạn đang không hy vọng nó được gọi, ném một NotImplementedException. Nó không nên được gọi và do đó bạn muốn có một ngoại lệ thời gian chạy.

Nếu ConvertBack là cố tình được gọi, thì bạn nên cung cấp triển khai tốt hơn cho nó. Một tùy chọn chỉ là trả về DependencyProperty.UnsetValue, hoặc xử lý các ngoại lệ trong việc thực thi ConvertBack của bạn bằng cách trả về DependencyProperty.UnsetValue.

Lý do của tôi cho điều này sẽ là: trả về DependencyProperty.UnsetValue thay vì ném NotImplementedException làm cho nó không rõ ràng khi phương thức ConvertBack được gọi khi bạn thực sự không bao giờ dự định. Có lẽ nó cần phải có một số chức năng bây giờ mà nó đang được gọi và ném một ngoại lệ thời gian chạy. Sẽ khó khăn hơn nhiều khi phát hiện ra chức năng ConvertBack bị thiếu nếu nó chỉ trả về DependencyProperty.UnsetValue.

+4

Nếu bạn định làm điều này, bạn nên sử dụng 'NotSupportedException', 'NotImplementedException' là dành cho chức năng hiện chưa được triển khai nhưng sẽ là. – Lukazoid

2

Tôi đồng ý với câu trả lời của @Todd White.

Ngoài ra, để tiết kiệm thời gian, bạn có thể triển khai lớp chuyển đổi cơ sở thực hiện ConvertBack cho bạn để bạn không phải triển khai nó mỗi lần lưu mã trùng lặp.

Về mặt kỹ thuật, bạn không phải ghi đè Convert một trong hai; Nhưng nó phải được thực hiện trong ConverterBase vì nó thực hiện tất cả các phương thức của giao diện IValueConverter. Trong thực tế, bạn sẽ ghi đè hầu hết thời gian là ConvertConvertBack.

public class ConverterBase : IValueConverter 
{ 
    public virtual object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return DependencyProperty.UnsetValue; 
    } 
    public virtual object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return DependencyProperty.UnsetValue; 
    } 
} 

public class VisibilityConverter : ConverterBase 
{ 
    public override object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return ((bool)value^(parameter as bool? == true)).ToVisibility(); 
    } 
} 
Các vấn đề liên quan