2012-01-20 32 views
5

Tôi có một tài sản phụ thuộc (Danh sách string) trong một điều khiển người dùng trong lắp ráp dot net của tôi như sauphụ thuộc Danh sách sở hữu <string> trong UserControl

public partial class ItemSelectionUserControl : UserControl 
{ 
    public List<string> AvailableItems 
    { 
     get { return (List<string>)this.GetValue(AvailableItemsProperty); } 
     set { this.SetValue(AvailableItemsProperty, value); } 
    } 
    public static readonly DependencyProperty AvailableItemsProperty = DependencyProperty.Register(
     "AvailableItems", typeof(List<string>), typeof(ItemSelectionUserControl), new FrameworkPropertyMetadata{BindsTwoWayByDefault =true}); 


    public ItemSelectionUserControl() 
    { 
     InitializeComponent(); 
    } 


} 

Tôi cố gắng để sử dụng usercontrol này trong usercontrol khác trong một khác nhau lắp ráp như bên dưới

<UserControl 
    xmlns:ctrl="clr-namespace:HH.Windows.UserControls;assembly=HH.Windows.UserControls" 
    /> 

    // ..... 
    <Grid> 
    <ctrl:ItemSelectionUserControl Grid.Column="0" Grid.Row="3" Grid.ColumnSpan="3" AvailableItems="{Binding Path=CheckList}"/> 
    </Grid> 

Tôi có thể thấy người truy cập CheckList được gọi, nhưng không đặt thuộc tính phụ thuộc "AvailableItems". Điểm ngắt trong tập hợp "AvailableItems" không bao giờ được gọi. Tôi đang làm gì sai?

+2

Có thể các loại không khớp? Xem [ở đây] (http://bea.stollnitz.com/blog/?p=52) để biết thêm thông tin về cách gỡ lỗi các ràng buộc WPF. –

Trả lời

5

Theo như tôi biết, WPF có thể không gọi trực tiếp cho người đặt của bạn nếu nó hiển thị DependencyProperty. Thay vào đó, nó có thể đặt trực tiếp DependencyProperty. Để biết thêm thông tin, hãy xem Dependency Properties Overview on MSDN. Đặc biệt phần này:

phụ thuộc Thuộc tính có thể là "Thiết lập" ở nhiều nơi
Sau đây là ví dụ XAML hợp tài sản tương tự (Background) có ba khác nhau "thiết lập" các hoạt động mà có thể ảnh hưởng đến giá trị. ..

Để kiểm tra xem điều này xảy ra trong ví dụ của bạn (cộng với nhận được thông báo, nơi bạn có thể hoạt động trên các giá trị đặt), bạn có thể thử thêm một Callback trong FrameworkPropertyMetadata

ví dụ:

public partial class ItemSelectionUserControl : UserControl 
{  
    public List<string> AvailableItems  
    {   
     get { return (List<string>)this.GetValue(AvailableItemsProperty); }   
     set { this.SetValue(AvailableItemsProperty, value); }  
    }  

    public static readonly DependencyProperty AvailableItemsProperty = 
     DependencyProperty.Register("AvailableItems", 
     typeof(List<string>), typeof(ItemSelectionUserControl), 
     new FrameworkPropertyMetadata(OnAvailableItemsChanged) 
     { 
      BindsTwoWayByDefault =true 
     });  

    public ItemSelectionUserControl()  
    {   
     InitializeComponent();  
    } 

    public static void OnAvailableItemsChanged(
      DependencyObject sender, 
      DependencyPropertyChangedEventArgs e) 
    { 
     // Breakpoint here to see if the new value is being set 
     var newValue = e.NewValue; 
     Debugger.Break(); 
    } 
} 
+0

@ Andrew- đã được phát hiện. Cảm ơn nhiều. Tôi không biết rằng WPF sẽ gọi trực tiếp thuộc tính phụ thuộc. – Jimmy

+0

Xin chào Jimmy, không sao cả. Câu hỏi được định dạng tốt của bạn được cho phép để có câu trả lời dễ dàng. Một WPF gotcha! :) –

0

Bạn chưa chỉ định chế độ ràng buộc của mình. Có lẽ nó là mặc định chỉ một chiều? Thử: {Binding Path=CheckList, Mode=TwoWay}

+0

Chỉ cần thử điều đó, không thay đổi – Jimmy

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