2013-07-29 36 views
7

Tôi có đoạn code sau phía sau, mà hoạt động:bất động sản tiêu chuẩn hoạt động, nhưng tài sản phụ thuộc không trong WPF

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

Và tôi có mã, mà tôi muốn có, nhưng nó không hoạt động . Thậm chí setter không bao giờ gọi:

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); 
    } 
} 

Việc sử dụng đó là trong XAML:

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

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

Tại sao các công trình bất động sản tiêu chuẩn và tài sản phụ thuộc không?

Trả lời

7

Với thuộc tính phụ thuộc, .Net đang làm điều gì đó không rõ ràng: nó truy cập thuộc tính phụ thuộc được xác định bởi ItemTemplateProperty trực tiếp thay vì sử dụng các phương pháp getset mà bạn đã khai báo. Sự khác biệt duy nhất, trong trường hợp này, là _list.ItemTemplate = value; của bạn không bao giờ chạy.

Khi bạn sử dụng thuộc tính phụ thuộc, getters và setters của bạn should only contain the usual things. Bất cứ điều gì khác sẽ kết thúc được gây nhầm lẫn vì WPF bỏ qua chúng khi nó sử dụng tài sản.

Nếu bạn cần đặt _list.ItemTemplate cho giá trị, bạn nên đính kèm một static PropertyChangedCallback bằng cách sử dụng other DependencyProperty.Register overload. Ví dụ.

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

Cũng xin lưu ý giải thích được cung cấp tại đây (http://msdn.microsoft.com/en-us/library/bb613563.aspx). – Clemens

+0

@Clemens Cảm ơn, tôi đã thêm liên kết đó (tôi đã nói điều tương tự, nhưng một nguồn văn bản chuyên nghiệp có thẩm quyền hơn không bao giờ là điều xấu). =) –

2

DependencyProperty không bao giờ gọi phương thức "Đặt", thay vào đó bạn sẽ phải tìm trình xử lý sự kiện PropertyChanged trong tạo tuyên bố quyền phụ thuộc.

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.. 
} 
Các vấn đề liên quan