2013-07-29 8 views
7
하지 않습니다

I 작동 뒤에 다음 코드를 가지고 :표준 속성이 작동하지만 종속성 속성은 WPF

public DataTemplate ItemTemplate 
{ 
    get { return _list.ItemTemplate; } 
    set { _list.ItemTemplate = value; } 
} 

을 그리고 난 내가 가진하려는 코드를 가지고 있지만, 그것이 작동하지 않습니다 . 심지어 세터가 호출되지 않습니다 :

public static readonly DependencyProperty ItemTemplateProperty = DependencyProperty.Register("ItemTemplate", typeof(DataTemplate), typeof(MyUserControl)); 
public DataTemplate ItemTemplate 
{ 
    get { return (DataTemplate)GetValue(ItemTemplateProperty); } 
    set 
    { 
     _list.ItemTemplate = value; 
     SetValue(ItemTemplateProperty, value); 
    } 
} 

그것의 사용은 XAML에 있습니다

<Window.Resources> 
    <DataTemplate x:Key="ItemTemplate"> 
     <TextBlock Text="{Binding Path=Name}"/> 
    </DataTemplate> 
</Window.Resources> 

<local:MyUserControl ItemTemplate="{StaticResource ItemTemplate}"/> 

표준 속성 작품과 종속성 속성하지 않는 이유는 무엇입니까?

답변

7

종속성 속성을 사용하면 .Net은 사용자가 선언 한 getset 메서드를 사용하는 대신 ItemTemplateProperty으로 식별되는 종속성 속성에 직접 액세스하고 있습니다. 이 경우 유일한 차이점은 사용자의 _list.ItemTemplate = value;이 절대로 실행되지 않는다는 것입니다.

종속성 속성을 사용할 때 getter 및 setters는 should only contain the usual things입니다. WPF는 속성을 사용할 때 WPF를 무시하기 때문에 혼란 스럽습니다.

값으로 _list.ItemTemplate을 설정해야하는 경우 other DependencyProperty.Register overload을 사용하여 정적 PropertyChangedCallback을 첨부해야합니다. 예 :

private static void OnItemTemplateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { 
    var uc = (MyUserControl)d; 
    uc._list.ItemTemplate = (DataTemplate)e.NewValue; 
} 
+0

[여기] (http://msdn.microsoft.com/en-us/library/bb613563.aspx)의 설명도 참조하십시오. – Clemens

+0

@Clemens 고마워, 나는 그 링크를 추가했다. (나는 이미 똑같은 말을했지만 더 전문적으로 작성된 권위있는 소스는 결코 나쁜 것이 아니다.) =) –

2

DependencyProperty를 결코 호출하지 "설정"방법은, 대신 당신은 종속성 속성 문을 생성 내에하여 PropertyChanged 이벤트 처리기를 찾을해야합니다.

public static readonly DependencyProperty ItemTemplateProperty = 
    DependencyProperty.Register(
     "ItemTemplate", 
     typeof(DataTemplate), 
     typeof(MyUserControl), 
     new FrameworkPropertyMetadata( 
      null, 
      new PropertyChangedCallback(ItemTemplateChanged))); 
public DataTemplate ItemTemplate 
{ 
    get { return (DataTemplate)GetValue(ItemTemplateProperty); } 
    set 
    { 
     _list.ItemTemplate = value; 
     SetValue(ItemTemplateProperty, value); 
    } 
} 

public static void ItemTemplateChanged(
    DependencyObject sender, 
    DependencyPropertyChangedEventArgs e){ 
    ((MyUserControl)sender).OnItemTemplateChanged(e); 
} 

protected void OnItemTemplateChanged(DependencyPropertyChangedEventArgs e){ 
    // you write your code here.. 
} 
관련 문제