2009-08-19 11 views
8

Tôi đang tạo một CustomFrol WPF có thuộc tính phụ thuộc với PropertyChangedCallback. Trong phương thức gọi lại đó, tôi cố gắng thiết lập các giá trị trên một số phần của điều khiển mà tôi lấy từ OnApplyMethod bằng phương thức GetTemplateChild().WPF CustomControl: OnApplyTemplate được gọi sau PropertyChangedCallback

Vấn đề là PropertyChangedCallback là (trên một số hệ thống) được gọi trước khi OnApplyTemplate để các bộ phận điều khiển vẫn còn null.

Giải pháp thay thế mà tôi hiện đang sử dụng là lưu e.NewValue từ PropertyChangedCallback thành biến thành viên và sau đó gọi SetValue (dp, _savedValue) trong OnApplyTemplate().

Cách thích hợp để giải quyết vấn đề này hoặc tôi đã sử dụng giải pháp tốt nhất là gì?

+2

Không chắc chắn tại sao mọi người chưa trả lời câu hỏi của bạn nhưng tôi có thể nói rằng tôi đang làm rất nhiều việc giống như bạn và cho đến nay nó thường có vẻ hoạt động. Tôi đã chạy vào một vấn đề cụ thể gần đây trong một thực hiện SplitButton mà hiện điều này, nơi các mục được lựa chọn đầu tiên không hiển thị nhưng sau khi tự chọn một mục nó. – jpierson

Trả lời

7

đó là những gì chúng tôi làm - không giải quyết problme trong priciple nhưng cung cấp với một cách rõ ràng để sửa chữa nó.

  1. Tạo một handler cho sự thay đổi sự kiện giá trị DP, để cho nó được OnValueChanged(). Nói chung không paramters cần thiết như bạn đã biết mà DP được thay đổi và luôn có thể có được giá trị hiện tại của nó.

  2. Tạo một lớp/cấu trúc được gọi là DeferredAction với hàm tạo, chấp nhận System.Action (đó sẽ là một tham chiếu đến OnValueChanged()) của bạn. Lớp này sẽ có một Action property và một phương thức, gọi là Execute().

Đây là những gì tôi sử dụng:

class DeferredAction 
{ 
    private Action action; 

    public DeferredAction(Action action) 
    { 
     this.action = action; 
    } 

    private Action Action 
    { 
     get { return this.action; } 
    } 

    public void Execute() 
    { 
     this.Action.Invoke(); 
    } 
} 
  1. Trong kiểm soát của bạn tạo ra một danh sách. Bộ sưu tập sẽ giữ danh sách các DeferredAction cho đến khi chúng có thể được áp dụng thành công (thường là sau base.OnApplyTemplate()). Khi hành động được áp dụng, bộ sưu tập phải được xóa để tránh xử lý kép.

  2. Trong vòng OnValueChanged kiểm tra xem phần của bạn (không) là rỗng (có khả năng là) và nếu có thêm trường hợp mới của DeferredAction (OnValueChanged() vào danh sách được tạo ở bước trước đó.) là một xử lý mục đích kép nó có thể được gọi ngay từ giá trị DP của bạn xử lý thay đổi, nếu các bộ phận không null, thay đổi nó được sử dụng như là một hành động hoãn thi hành được thực thi. biết, nếu họ đang ở đó, họ đã không được áp dụng) và gọi Execute cho mỗi người trong số họ.Xóa danh sách ở cuối.

Chúc mừng