2009-04-29 69 views
7

Chúng tôi có một đối tượng xuất phát từ DependencyObject và triển khai một số DependencyProperties.Thuộc tính phụ thuộc tùy chỉnh và liên kết hai chiều trong WPF

Về cơ bản một cái gì đó như thế này:

class Context : DependencyObject { 
    public static readonly DependencyProperty NameProperty = 
    DependencyProperty.Register ("Name", typeof (string), typeof (Context), new PropertyMetadata ("")); 
    public string Name { 
     get { 
      return (string)this.GetValue (NameProperty); 
     } 
     set { 
      this.SetValue (NameProperty, value); 
     } 
    } 
} 

này hoạt động, tài sản được thiết lập, có thể bị ràng buộc, vv vấn đề này được đưa ra khi tôi liên kết với propery từ WPF, sử dụng một ràng buộc TwoWay. Phần TwoWay không bao giờ thực sự xảy ra, WPF không bao giờ gọi tập hợp thuộc tính này. Tôi đã thiết lập sự ràng buộc của mình như sau:

<TextBox Text="{Binding Path=Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 

Trong trường hợp này, nhập vào hộp văn bản phải cập nhật ngay lập tức thuộc tính Tên nhưng không được cập nhật ngay. Nếu tôi thay đổi thuộc tính Name thành thuộc tính POCO thông thường, nó hoạt động (mặc dù phía bên kia của TwoWay rõ ràng là không trừ khi tôi thực hiện INotifyPropertyChanged).

Tôi đang làm gì sai ở đây? Điều này nên là một điều thực sự đơn giản để làm, nhưng nó gây ra cho tôi không có kết thúc của đau đầu.

Trả lời

11

Đây là hành vi mong đợi. Thuộc tính CLR chỉ đơn thuần là một trình bao bọc xung quanh DependencyProperty bên dưới. WPF thường tối ưu hóa bằng cách gọi trực tiếp GetValueSetValue. Nếu bạn cần logic tùy chỉnh để thực thi thì hãy sử dụng siêu dữ liệu của DependencyProperty.

+0

Geez, tôi là đồ ngốc. Bạn là chính xác 100%, giá trị chính nó được thiết lập chính xác, nhưng setter không bao giờ được gọi, đó là những gì thông qua tôi tắt. Cảm ơn. –

2

Sau khi vấn đề này chi phí cho tôi một chút thời gian:

Đối với những người bạn của những người có cùng một vấn đề, nhưng - như tôi - không thấy giải pháp trong câu trả lời ở trên:

Để hỗ trợ thừa kế DataContext, lớp tùy chỉnh (Ngữ cảnh trong trường hợp này) phải được lấy từ FrameworkElement thay vì DependencyObject. Đó là tất cả.

Marc

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