2011-06-21 29 views
33

Cách sử dụng phương pháp ConvertBack trong giao diện IValueConverter là gì.Việc sử dụng phương thức ConvertBack trong giao diện IValueConverter là gì?

Khi nào sẽ gọi?

Hoặc yêu cầu yêu cầu của phương thức ConvertConvertBack là gì.

Tôi có hỏi câu hỏi ở đây vì: Tôi đã bị ràng buộc một tài sản của codebehind để TEXT TextBox của tài sản và sử dụng convertor cho thuộc tính đó

sau đó Convert Phương pháp đầu tiên gọi và khi tôi thay đổi TEXT trong TEXTBOX gì xảy ra nhưng ngay khi tôi đóng biểu mẫu, hãy gọi phương thức ConvertBack.

này là gì, không có bất kỳ quy tắc xác định khi nào kích hoạtConvertBack phương pháp?

LƯU Ý: bạn có thể thấy rằng điều này có thể trùng lặp với câu hỏi khác trên trang này ... nhưng không phải bất kỳ câu hỏi nào tôi đã sử dụng đầy đủ trong danh sách đề xuất khi tôi viết câu hỏi của mình.

Trả lời

34

IMO, phương pháp ConvertBack được sử dụng để chuyển đổi hình ảnh đại diện của bạn trong những dữ liệu vào DataType cụ thể. Ví dụ: bạn sử dụng Bộ chuyển đổi để chuyển đổi boolean true thành chuỗi "TrueBoolean". Văn bản này sẽ được hiển thị trong TextBox của bạn. Khi bạn thay đổi giá trị của Hộp văn bản, phương thức ConvertBack sẽ được gọi ngay khi liên kết bật lại (mặc định là OnFocusLost). Bây giờ phương thức ConvertBack của bạn sẽ cố gắng chuyển đổi giá trị mới thành kiểu dữ liệu bạn muốn. Vì vậy, bạn sẽ phải thực hiện logic để chuyển đổi "FalseBoolean" thành false.

public class Converter : IValueConverter 
{ 
    object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return (bool) value ? "TrueBoolean" : "FalseBoolean"; 
    } 

    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var s = (string) value; 
     if (s.Equals("TrueBoolean",StringComparison.CurrentCultureIgnoreCase)) 
      return true; 
     if (s.Equals("FalseBoolean", StringComparison.CurrentCultureIgnoreCase)) 
      return false; 
     throw new Exception(string.Format("Cannot convert, unknown value {0}", value)); 
    } 
} 

Kỹ thuật này được sử dụng rất nhiều trong DataGrids nếu tôi không nhầm.

Hy vọng điều này là một chút rõ ràng ...

CẬP NHẬT
Về bạn chất vấn trong các bình luận:
Để ghi đè lên hành vi ràng buộc mặc định OnFocusLost bạn phải thay đổi ràng buộc của bạn như thế này:

<TextBox Text="{Binding MyText, UpdateSourceTrigger=PropertyChanged}"/> 
<!--syntax might differ, can't access VS at the moment.--> 
+0

@Roel, ya nhưng trong trường hợp của tôi ConvertBack là lửa khi tôi đóng cửa sổ, không phải là lạ? –

+1

không, tôi cho rằng đây là hành vi bình thường: Trước khi cửa sổ đóng, sự kiện OnFocusLost của TextBox sẽ được kích hoạt, hoặc ít nhất ràng buộc sẽ cập nhật. – RoelF

+0

@Roel, tôi nên làm gì nếu tôi cần phải gọi phương thức ConvertBack ngay sau khi có bất kỳ thay đổi nào trong TEXT của TEXTBOX? tôi không thể tìm thấy tài sản kích hoạt nguồn cập nhật như @Dominik nói ... –

28

ConvertBack là khi bạn có mode=TwoWay về ràng buộc của mình.

Nó chuyển đổi đầu vào của người dùng trở lại vào kiểu dữ liệu mà bạn đang ràng buộc và được gọi khi số TextBox (nói) mất tiêu điểm. Ví dụ: (nếu điều này không được xây dựng), nếu bạn có một số đại diện cho một giá, phương pháp Convert sẽ lấy giá trị và định dạng nó thành một chuỗi với ký hiệu tiền tệ chính xác, dấu phân cách thập phân, v.v.

Nếu người dùng nhập một giá trị mới - bao gồm ký hiệu tiền tệ có thể, hàng nghìn dấu phân cách, v.v. bạn sẽ sử dụng phương thức ConvertBack để phân tích chuỗi và trích xuất giá trị số.

Ví dụ khác có thể là nhập số thẻ tín dụng. Người dùng có thể nhập số dưới dạng một chuỗi các chữ số hoặc nhóm các chữ số được phân tách bằng dấu cách hoặc dấu gạch ngang. Phương pháp ConvertBack sẽ lấy tất cả các yếu tố đầu vào có thể và chuyển đổi chúng thành định dạng duy nhất bạn yêu cầu.

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