2010-11-19 13 views
34

Chỉ cần một câu hỏi ngắn, để làm rõ một số nghi ngờ. Các bộ định tuyến không chạy khi một phần tử được liên kết với một thuộc tính phụ thuộc?Người định cư không chạy trên Thuộc tính phụ thuộc?

public string TextContent 
{ 
    get { return (string)GetValue(TextContentProperty); } 
    set { SetValue(TextContentProperty, value); Debug.WriteLine("Setting value of TextContent: " + value); } 
} 

public static readonly DependencyProperty TextContentProperty = 
    DependencyProperty.Register("TextContent", typeof(string), typeof(MarkdownEditor), new UIPropertyMetadata("")); 

...

<TextBox Text="{Binding TextContent}" /> 

Như tôi đã nhận ra bên dưới trong setter của tôi không chạy

Debug.WriteLine("Setting value of TextContent: " + value); 
+0

nếu bạn đặt điểm ngắt trong trình cài đặt, bạn có thể thấy nơi đặt. – VoodooChild

+4

Nếu bạn cần thực thi mã khi thuộc tính được đặt, hãy xem CoerceValueCallback hoặc ValueChangedCallback của lớp UIMetadata. – Jens

+0

có thể trùng lặp của [WPF: tuyên bố tài sản XAML không được thiết lập thông qua Setters?] (Http://stackoverflow.com/questions/3836076/wpf-xaml-property-declarations-not-being-set-via-setters) –

Trả lời

46

Động cơ ràng buộc WPF gọi GetValueSetValue trực tiếp (bỏ qua các setters tài sản và getters). Bạn cần thuộc tính ở đó để nó có thể được hỗ trợ trong đánh dấu XAML (và biên dịch chính xác).

+0

Xin chào , Tôi không chắc chắn để hiểu những gì bạn nói? – Emixam23

+0

@ Emixam23 Dean đang nói rằng OP không thể đặt một câu lệnh debug trong thuộc tính TextContent để xác định xem DP có bị ràng buộc đúng hay không, bởi vì WPF sẽ gọi SetValue, không phải là thiết lập TextContent. – Dave

34

Để tạo DependencyProperty, thêm trường tĩnh loại DepdencyProperty vào kiểu của bạn và gọi DependencyProperty.Register() để tạo một cá thể của thuộc tính phụ thuộc. Tên của DependendyProperty phải luôn kết thúc bằng ... Thuộc tính. Đây là quy ước đặt tên trong WPF.

Để làm cho nó có thể truy cập dưới dạng thuộc tính .NET bình thường, bạn cần phải thêm trình bao bọc thuộc tính. Trình bao bọc này không làm gì khác ngoài việc nhận và thiết lập giá trị nội bộ bằng cách sử dụng các phương thức GetValue() và SetValue() được thừa hưởng từ DependencyObject và truyền đi DependencyProperty làm khóa.

Không thêm bất kỳ logic nào vào các thuộc tính này, vì chúng chỉ được gọi khi bạn đặt thuộc tính từ mã. Nếu bạn đặt thuộc tính từ XAML, phương thức SetValue() được gọi trực tiếp.

Mỗi DependencyProperty cung cấp gọi lại cho thông báo thay đổi, cưỡng chế giá trị và xác thực. Những callbacks này được đăng ký trên thuộc tính dependency.

nguồn: http://www.wpftutorial.net/DependencyProperties.html

+0

bạn đã cứu mạng tôi! – j00hi