Liên kết MSDN mà bạn cung cấp cho biết họ khá tốt:
Phương pháp này được sử dụng bởi một thành phần rằng lập trình đặt giá trị của một trong những đặc tính riêng của mình mà không vô hiệu hóa một ứng dụng tuyên bố sử dụng bất động sản. Phương thức SetCurrentValue thay đổi giá trị hiệu quả của thuộc tính, nhưng trình kích hoạt hiện tại, ràng buộc dữ liệu và kiểu sẽ tiếp tục hoạt động.
Giả sử bạn đang viết các TextBox
kiểm soát và bạn đã tiếp xúc với một tài sản mà người ta thường sử dụng Text
như sau:
<TextBox Text="{Binding SomeProperty}"/>
Trong mã của kiểm soát của bạn, nếu bạn gọi SetValue
bạn sẽ ghi đè lên ràng buộc với bất cứ điều gì bạn cung cấp. Tuy nhiên, nếu bạn gọi số SetCurrentValue
, sẽ đảm bảo rằng thuộc tính có giá trị đã cho, nhưng sẽ không hủy bất kỳ ràng buộc nào.
Theo sự hiểu biết tốt nhất của tôi, lời khuyên của Greg là không chính xác. Bạn nên luôn sử dụng GetValue
/SetValue
từ thuộc tính trình bao bọc CLR của mình. SetCurrentValue
hữu ích hơn trong các trường hợp bạn cần thuộc tính để nhận giá trị đã cho nhưng không muốn ghi đè bất kỳ ràng buộc, trình kích hoạt hoặc kiểu nào đã được định cấu hình đối với thuộc tính của bạn.
Nguồn
2010-11-20 11:01:18
Trong blog của Vincent Sibal (http://blogs.msdn.com/b/vinsibal/archive/2009/05/21/the-control-local-values-bug-solution-and-new-wpf-4- 0-related-apis.aspx) bạn có thể đọc phần sau ở cuối. "Đối với một nhà phát triển điều khiển, khuyến cáo chung là luôn sử dụng DependencyObject.SetCurrentValue trên DependencyObject.SetValue trong mã Control. Bạn sẽ nhận thấy rằng các điều khiển cổ phiếu của chúng tôi trong khung công tác 4.0 đã được cập nhật để sử dụng API này thay vì thiết lập các thuộc tính giá trị cục bộ. " Cả hai đều có thể đúng nhưng bạn có thể giải thích sự khác biệt ở đây và đề xuất từ blog không? –
@Meleak: thành thật mà nói, tôi nghĩ rằng bài viết là một chút không rõ ràng. Tôi nghĩ rằng ông có nghĩa là để nói rằng 'SetCurrentValue' nên được sử dụng bất cứ nơi nào trong kiểm soát của bạn, nơi bạn muốn * nội bộ * sửa đổi một giá trị của thuộc tính phụ thuộc.Thật vậy, nếu bạn mở dự án ví dụ của mình, bạn sẽ thấy anh ta vẫn đang sử dụng 'GetValue' và' SetValue' trong trình bao bọc thuộc tính CLR. Thật vậy, nếu bạn crack mở phản xạ chống lại .NET 4.0 bạn sẽ thấy đó vẫn là trường hợp quá. –
Hmm, cho đến nay, tôi đã sử dụng 'SetValue' như được tạo bởi Visual Studio, nó hoạt động tốt. Tôi không thực sự hiểu ý bạn bằng cách phá hủy ràng buộc. Sau khi thay đổi giá trị 1, ràng buộc của tôi không bị phá hủy? cos Tôi vẫn có thể thực hiện thay đổi và Binding vẫn hoạt động? –