2012-08-15 30 views
6

Trong ví dụ dưới đây, chúng tôi đã ràng buộc một ViewModel thành một khung nhìn với một thuộc tính duy nhất có tên là Message. Thuộc tính này bị ràng buộc vào một TextBox với một ràng buộc hai chiều. Đối với thử nghiệm này, chúng tôi đang thực hiện một số ràng buộc giá trị trong setter và nâng cao tài sản thay đổi một lần nữa.Giá trị Coerce trong thuộc tính Setter - Silverlight 5

Trong Silverlight 4, tính năng này hoạt động hoàn hảo. Nếu thuộc tính tin nhắn thay đổi trong setter thuộc tính, hộp văn bản sẽ thấy giá trị mới. Ví dụ. gõ "A" vào hộp văn bản và mất tiêu điểm sẽ dẫn đến Aaaaaaaaaaa xuất hiện khi giá trị được thay đổi.

Trong Silverlight 5, điều này dường như bị hỏng/thay đổi. Bộ khởi động không bao giờ được nhấn sau khi giá trị được sửa đổi trong setter. Thêm một IValueConverter ở giữa, cho thấy rằng các Convert/ConvertBack phương pháp không bao giờ trúng. Dường như một cái gì đó cơ bản đã thay đổi giữa phiên bản 4 và 5. Có bất kỳ thay đổi nào không? Đây có phải là một lỗi?

public class ViewModel : INotifyPropertyChanged 
{ 
    private string _message; 

    public event PropertyChangedEventHandler PropertyChanged; 

    public string Message 
    { 
     get 
     { 
      return _message; 
     } 
     set 
     { 
      _message = value; 
      this.RaisePropertyChanged(); 

      if (_message.Length < 10) 
      { 
       _message = _message.PadRight(10, 'a'); 
       this.RaisePropertyChanged(); 
      } 
     } 
    } 

    private void RaisePropertyChanged() 
    { 
     var handler = this.PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs("Message")); 
     } 
    } 
} 

Trả lời

1

Điều này đã được xác nhận là lỗi trong Silverlight 5 của Microsoft. Nó chỉ xảy ra trong chế độ gỡ lỗi, vì vậy là tốt cho chế độ phát hành.

Nếu bạn vô hiệu hóa gỡ rối ràng buộc XAML, vấn đề đã biến mất.

Binding.IsDebuggingEnabled = false; 
3

Có một số cách giải quyết cho vấn đề này dường như là lỗi trong tính năng gỡ lỗi liên kết của Silverlight 5 (xem câu trả lời @Ray Booysen).

Trước tiên, điều quan trọng là phải biết rằng đây không phải là vấn đề trong sản xuất mà đúng hơn, chỉ xảy ra khi gỡ lỗi ứng dụng. Do đó, các cách giải quyết chỉ thực sự tái tạo hành vi sản xuất trong môi trường gỡ lỗi (mặc dù một số tính năng gỡ lỗi đã bị vô hiệu hóa).

Việc đầu tiên của công việc xung quanh là tắt gỡ lỗi ràng buộc bằng cách sử dụng trường tĩnh (được chia sẻ trong VB.Net) có tên IsDebuggingEnabled trong lớp Binding. Tài liệu có cung cấp đề xuất sau.

bộ lĩnh vực này là false trong constructor lớp ứng dụng của bạn

Lưu ý: Sự thay đổi này không thể được giới hạn trong một ràng buộc duy nhất nhưng thay vì sẽ ảnh hưởng đến tất cả các ràng buộc trong ứng dụng.

Cách thứ hai là tắt trình gỡ lỗi Silverlight trong thuộc tính dự án cho dự án Web đang lưu trữ ứng dụng Silverlight. Thực hiện thay đổi này bằng các bước sau.

  1. Nhấp chuột phải vào dự án Web trong Solution Explorer và chọn Thuộc tính.
  2. Chọn tab Web.
  3. Cuộn xuống phần Gỡ lỗi.
  4. Bỏ chọn hộp kiểm có nhãn Silverlight.

Lưu ý: Thay đổi này không chỉ gỡ lỗi liên kết cho ứng dụng mà còn gỡ lỗi Silverlight chung. Tuy nhiên, các trình gỡ rối khác có thể được kích hoạt.

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