2012-01-20 9 views
5

Mam właściwość zależność (List of string) w kontroli użytkownika w moim dot montażu netto poniżejZależność Lista nieruchomość <string> w 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(); 
    } 


} 

próbuję użyć tego usercontrol w innym usercontrol w inny zespół poniżej

<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> 

widzę akcesor get z listy kontrolnej nazywa się zaczyna, ale nie jest to ustawienie właściwości zależność „AvailableItems”. Punkt przerwania w zestawie "AvailableItems" nigdy nie jest wywoływany. Co ja robię źle?

+2

Być może typy się nie zgadzają? Zobacz [tutaj] (http://bea.stollnitz.com/blog/?p=52), aby uzyskać więcej informacji na temat debugowania powiązań WPF. –

Odpowiedz

5

O ile mi wiadomo, nie może wezwać WPF setter z nieruchomości bezpośrednio, jeżeli naraża DependencyProperty. Zamiast tego może bezpośrednio ustawić wartość DependencyProperty. Aby uzyskać więcej informacji, zobacz Dependency Properties Overview on MSDN. W szczególności tym odcinku:

Właściwości Zależność może być „Set” w wielu miejscach
Poniżej przykład XAML gdzie ta sama nieruchomość (w tle) ma trzy różne „set” operacje, które mogłyby mieć wpływ na wartość. ..

Aby sprawdzić, czy to dzieje się w Twojej przykład (plus otrzymasz powiadomienie, gdzie można działać na ustawionej wartości), można spróbować dodać oddzwaniania w FrameworkPropertyMetadata

np.

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- to było na miejscu. Dziękuję Ci bardzo. Nie wiedziałem, że WPF bezpośrednio wywoła właściwość zależności. – Jimmy

+0

Cześć Jimmy, nie ma problemu. Twoje dobrze sformatowane pytanie pozwoliło na łatwą odpowiedź. Kolejny wątek WPF! :) –

0

Nie określono trybu wiązania. Być może domyślnie jest to tylko w jedną stronę? Spróbuj: {Binding Path=CheckList, Mode=TwoWay}

+0

Po prostu próbowałem, bez zmian – Jimmy