2012-01-20 8 views
5

que tiene una propiedad de dependencia (Lista de cadena) en un control de usuario en mi punto de conjunto de la red de la siguiente maneraDependencia Lista propiedad <string> de control de usuario

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


} 

Estoy tratando de utilizar este control de usuario en otro control de usuario en un diferente el montaje de la siguiente manera

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

puedo ver el acceso get de la lista de verificación está recibiendo llamadas, pero no está estableciendo la propiedad de dependencia "AvailableItems". El punto de interrupción en el conjunto de "AvailableItems" nunca se llama. ¿Qué estoy haciendo mal?

+2

¿Tal vez los tipos no coinciden? Consulte [aquí] (http://bea.stollnitz.com/blog/?p=52) para obtener más información sobre cómo depurar enlaces WPF. –

Respuesta

5

Por lo que yo sé, WPF no puede llamar a la incubadora de su propiedad directamente si se expone una DependencyProperty. En su lugar, puede establecer el DependencyProperty directamente. Para obtener más información, consulte Dependency Properties Overview on MSDN. En particular, esta sección:

propiedades de dependencia podría ser "set" en varios lugares
La siguiente es ejemplo de XAML en la misma propiedad (fondo) tiene tres "set" operaciones diferentes que podrían influir en el valor. ..

Para probar si esto está ocurriendo en su ejemplo (además de obtener una notificación donde se puede operar sobre el valor de ajuste), puede intentar añadir una devolución de llamada en el FrameworkPropertyMetadata

p.

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- eso fue perfecto. Muchas gracias. No sabía que WPF llamaría directamente a la propiedad de dependencia. – Jimmy

+0

Hola Jimmy, no hay problema en absoluto. Su pregunta bien formateada permitió una respuesta fácil. Otro WPF gotcha! :) –

0

No ha especificado el modo de su encuadernación. ¿Tal vez está incumpliendo de manera unidireccional? Probar: {Binding Path=CheckList, Mode=TwoWay}

+0

Acabo de probar eso, sin cambios – Jimmy

Cuestiones relacionadas