2012-02-09 6 views
5

tôi xác định tài sản trong usercontrol của tôi như thế này:DependencyProperty không được kích hoạt

public bool IsSelected 
    { 
     get { return (bool)GetValue(IsSelectedProperty); } 
     set 
     { 
      SetValue(IsSelectedProperty, value); 
      StackPanelDetails.Visibility = value ? Visibility.Visible : Visibility.Collapsed; 
     } 
    } 

    public static readonly DependencyProperty IsSelectedProperty = 
     DependencyProperty.Register("IsSelected", typeof (bool), typeof (ucMyControl)); 

Nhưng khi tôi đặt tài sản của mình trong XAML, nó muốn kích hoạt nó (thiết lập không được gọi).

<DataTemplate><local:ucTopicItem IsSelected="False" /></DataTemplate> 

Điều gì có thể là vấn đề?

+1

Lớp ucMyControl có chứa tập hợp các đối tượng ucTopicItem không? Chúng giống nhau hả? Bạn đang đăng ký DP trên ucMyControl, nhưng thiết lập nó trên một ucTopicItem. Bạn cũng có thể muốn thử RegisterAttached thay vì Register. – avanek

Trả lời

8

Các setter của DependencyProperty của bạn sẽ không được gọi bằng WPF khi DP được thiết lập trong XAML. WPF sẽ thiết lập DependencyProperty trực tiếp.

Xem MSDN XAML Loading and Dependency Properties để biết giải thích tại sao trình gỡ cài đặt không được gọi.

+0

Thật đáng tiếc. Nhưng tôi đoán điều này trả lời câu hỏi. – Nickolodeon

5

Bạn nên sử dụng trình xử lý thay đổi thuộc tính trực tiếp trong thuộc tính phụ thuộc của mình. Bằng cách này, bạn đảm bảo rằng nó được gọi khi đặt trong XAML:

public static readonly DependencyProperty IsSelectedProperty = 
    DependencyProperty.Register("IsSelected", typeof(bool), typeof(ucMyControl), new PropertyMetadata(false, OnIsSelectedChanged)); 

private static void OnIsSelectedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    // Implement change logic 
} 
+0

Chết tiệt, gazumped :) –

+0

Tôi đã làm điều đó, nhưng OnIsSelectedChanged vẫn không nhận được gọi. – Nickolodeon

+0

@Nickolodeon, bạn phải đăng ký PropertyChangedCallback thông qua đối số 'PropertyMetadata' trong [Register] (http://msdn.microsoft.com/en-us/library/ms597502.aspx). – Clemens