2012-06-26 23 views
9

Tôi đã có một vấn đề mà tôi cần phải biết về tất cả các ràng buộc đã được thực hiện cho các thuộc tính phụ thuộc của đối tượng của tôi. Hiện tại, tôi đang lặp qua các thuộc tính phụ thuộc bất cứ khi nào datacontext của tôi thay đổi và tìm kiếm các biểu thức ràng buộc. Nhưng tôi đã phát hiện ra rằng trong một số trường hợp (TabControls), bối cảnh dữ liệu dường như được đặt trước, sau đó các ràng buộc từ XAML được áp dụng.Có sự kiện nào xảy ra khi một ràng buộc đã được đặt trên một thuộc tính không?

Vì vậy, có cách nào để tôi có thể phát hiện ràng buộc được áp dụng cho một trong các thuộc tính phụ thuộc của tôi không?

+0

Tại sao bạn làm cái đó? – MBen

+0

Một chút phức tạp để giải thích, nhưng về cơ bản là đối tượng là ngữ cảnh dữ liệu (một lớp trợ giúp để trực quan hóa dữ liệu của lớp khác) biết rằng điều khiển này trình bày một giao diện để chỉnh sửa đối tượng được lưu trữ trong thuộc tính được chỉ định trong đường dẫn biểu thức ràng buộc. – JoshG

Trả lời

7

Giả sử bạn đang ở trong một UserControl, bạn sẽ có thể sử dụng Loaded sự kiện này. Sự kiện đó được kích hoạt khi "phần tử được đặt ra, được hiển thị và sẵn sàng cho tương tác". Tôi chỉ có thể giả định điều này có nghĩa là các ràng buộc đã được hoàn thành.

Sau đó, bạn có thể, trong trình xử lý sự kiện Loaded chỉ cần nói cho nội dung dữ liệu mà bạn đang ràng buộc với nó.

Nếu bạn mong đợi dữ liệu địa lý thay đổi, bạn sẽ cần kết hợp điều này với trình xử lý sự kiện DataContextChanged.

+0

Cảm ơn bạn đã hiểu câu hỏi của tôi. Đây thực sự là những gì tôi đang tìm kiếm! Tôi vừa kiểm tra và giả định của bạn dường như giữ nguyên. Cảm ơn – JoshG

+2

Thực ra, 'Loaded' và' Unloaded' được gọi bất cứ khi nào phần tử được tải/không tải từ cây trực quan và có thể xảy ra nhiều lần trong suốt thời gian tồn tại của phần tử đó (ví dụ: thay đổi chủ đề có thể khiến tải lại phần tử). – Grx70

+0

Bạn tất nhiên là đúng @ Grx70 - Tôi còn trẻ một thiếu kinh nghiệm khi tôi viết câu trả lời này ;-) Tôi đã xóa câu đó ngay bây giờ. –

-1

Tăng sự kiện khi thay đổi thuộc tính chính xác là những gì INotifyPropertyChanged thực hiện. Có một thành viên cần thiết để thực hiện INotifyPropertyChanged và đó là sự kiện PropertyChanged

mẫu và biết thêm chi tiết: Raise an event whenever a property's value changed?

+0

Tôi không muốn biết khi nào tài sản thay đổi. Tôi muốn biết khi một ràng buộc đã được kết nối với tài sản. Tôi không tin rằng giải pháp của bạn thực hiện điều này? Thuộc tính có thể không thay đổi bằng cách kết nối một ràng buộc. tức là giá trị = null, với giá trị ràng buộc, giá trị vẫn = null. – JoshG

2

tôi cho rằng năm bằng cách sử dụng sự kiện DataContextChanged tĩnh tin để biết khi nào yr DataContext thay đổi ngay

đây là một số mã của tôi Đây là những gì tôi làm

public static readonly DependencyProperty ApplicationDataContextProperty = 
      DependencyProperty.Register("ApplicationDataContext", 
      typeof(Object), 
      typeof(MyControl), 
      new PropertyMetadata(MyControl_DataContextChanged)); 

// my constructor 

     public MyControl() 
     { 

       InitializeComponent(); 

       if (!DesignerProperties.GetIsInDesignMode(new DependencyObject())) 
       { 
        SetBinding(ApplicationDataContextProperty, new Binding()); 
       } 

     } 

// my event 
     private static void MyControl_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) 
     { 

       MyControl thisControl = sender as MyControl 
       if (thisControl != null) 
       { 
        INotifyPropertyChanged propertyChanged; 
        propertyChanged = e.OldValue as INotifyPropertyChanged; 
        if (propertyChanged != null) 
         propertyChanged.PropertyChanged -= thisControl.propertyChanged_PropertyChanged; 


        propertyChanged = e.NewValue as INotifyPropertyChanged; 
        if (propertyChanged != null) 
         propertyChanged.PropertyChanged += thisControl.propertyChanged_PropertyChanged; 
       } 

     } 

// my 2e event 
     void propertyChanged_PropertyChanged(object sender, PropertyChangedEventArgs e) 
     { 

       if (e.PropertyName == "ListWithUsers") 
        LoadGrid(); 


     } 
+0

Vâng, tôi đang sử dụng DataContextChanged + = event handler. Tôi làm điều này trước khi InitializeComponent() trong hàm khởi tạo của điều khiển của tôi. Bên trong OnDataContextChanged, nó trả về null cho các biểu thức ràng buộc chắc chắn bị ràng buộc (ràng buộc hoạt động trực quan). Nhưng rõ ràng chưa được chỉ định. – JoshG

+0

Nếu tôi chỉ đơn giản là thay đổi ngữ cảnh dữ liệu, thì vì điều khiển đã được khởi tạo, sau đó các biểu thức ràng buộc trả về hoàn hảo. – JoshG

+0

Hmm ... Làm thế nào để biết bối cảnh dữ liệu đã thay đổi giúp tôi phát hiện khi một ràng buộc đã được áp dụng cho đối tượng của tôi? – JoshG

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