2012-06-01 13 views
8

Estoy intentando vincular una propiedad de dependencia a través de XAML a mi control WPF personalizado.WPF Dependency Propiedad no configurada

Así es como me registro de la propiedad de dependencia:

public static readonly DependencyProperty AltNamesProperty = 
    DependencyProperty.Register ("AltNames", typeof(string), typeof(DefectImages)); 

public string AltNames 
{ 
    get { return (string) GetValue(AltNamesProperty); } 
    set { SetValue(AltNamesProperty, value); } 
} 

Y Así es como yo lo llamo en mi XAML:

<DataGrid.Columns>     
    <DataGridTemplateColumn IsReadOnly="True"> 
     <DataGridTemplateColumn.CellTemplate> 
      <DataTemplate> 
       <StackPanel Name="StackPanel1" Grid.Column="0" Width="950"> 
        <TextBlock FontSize="16" TextDecorations="None" Text="{BindingPath=StandardName}" Foreground="Black" FontWeight="Bold" Padding="5,10,0,0"></TextBlock> 
        <TextBlock Text="{Binding Path=AltNames}"TextWrapping="WrapWithOverflow" Padding="5,0,0,10"></TextBlock> 
        <!-- this part should be magic!! --> 
        <controls:DefectImages AltNames="{Binding Path=AltNames}"></controls:DefectImages> 
       </StackPanel> 
      </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
    </DataGridTemplateColumn> 
</DataGrid.Columns> 

sé la propiedad AltNames que estoy tratando de unirse a es una propiedad válida porque puedo mostrarla en un bloque de texto muy bien. ¿Estoy registrando la propiedad de Dependencia de forma incorrecta?

¿Qué debo hacer para obtener el valor correcto asignado a AltNames en mi código?

+0

¿Has probado 'AltNames = "{Binding Path = AltNames, Modo = TwoWay}"'? ¿Hay algún error vinculante en la ventana de salida durante el tiempo de ejecución? – nemesv

+0

@nemesv acaba de probar el enlace bidireccional, sin suerte. No hay errores de enlace en la ventana de salida. – jacobsimeon

+0

Es probable que esto se confunda por 2 propiedades que comparten el mismo nombre. ¿Has intentado cambiarle el nombre a uno? ¡La solución que marcó como respuesta parece rara! – Gusdor

Respuesta

11

Gracias a @Danko por hacerme comenzar. Registré una devolución de llamada para establecer el valor cuando la propiedad cambia.
Esto es lo que finalmente terminó con:

private static void OnDefectIdChanged(DependencyObject defectImageControl, DependencyPropertyChangedEventArgs eventArgs) 
{ 
    var control = (DefectImages) defectImageControl; 
    control.DefectID = (Guid)eventArgs.NewValue; 
} 

/// <summary> 
/// Registers a dependency property, enables us to bind to it via XAML 
/// </summary> 
public static readonly DependencyProperty DefectIdProperty = DependencyProperty.Register(
    "DefectID", 
    typeof (Guid), 
    typeof (DefectImages), 
    new FrameworkPropertyMetadata(
     // use an empty Guid as default value 
     Guid.Empty, 
     // tell the binding system that this property affects how the control gets rendered 
     FrameworkPropertyMetadataOptions.AffectsRender, 
     // run this callback when the property changes 
     OnDefectIdChanged 
    ) 
    ); 

/// <summary> 
/// DefectId accessor for for each instance of this control 
/// Gets and sets the underlying dependency property value 
/// </summary> 
public Guid DefectID 
{ 
    get { return (Guid) GetValue(DefectIdProperty); } 
    set { SetValue(DefectIdProperty, value); } 
} 
2

Quizás necesite especificar el argumento PropertyMetadata en DependencyProperty.Register, si la propiedad afecta cómo se representa el control. Por ejemplo:

DependencyProperty.Register("AltNames", typeof(string), typeof(DefectImages), 
           new FrameworkPropertyMetadata(null, 
           FrameworkPropertyMetadataOptions.AffectsRender)); 
+0

Intenté esto, y todavía no me está yendo. Coloqué un punto de interrupción en el colocador para la propiedad AltNames y nunca se ejecuta. – jacobsimeon

+0

Bueno, el setter en realidad nunca se ejecuta, porque el enlace se realiza "detrás de escena". Puede probar [este constructor PropertyMetadata] (http://msdn.microsoft.com/en-us/library/ms557327.aspx) para especificar un método de devolución de llamada que se ejecuta cuando se cambia la propiedad. Además, consulte [¿Cómo puedo depurar enlaces WPF?] (Http://bea.stollnitz.com/blog/?p=52). –

+0

eso es exactamente lo que acabo de hacer. Usar la devolución de llamada para establecer el valor trabajado para mí. Gracias por ponerme en el camino correcto. – jacobsimeon

Cuestiones relacionadas