2012-06-01 12 views
8

Ich versuche, eine Abhängigkeitseigenschaft über XAML an mein benutzerdefiniertes WPF-Steuerelement zu binden.WPF-Abhängigkeitseigenschaft wird nicht festgelegt

Hier ist, wie ich die Abhängigkeitseigenschaft registrieren:

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

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

Und hier ist, wie ich es in meiner XAML nennen:

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

Ich kenne die AltNames Eigenschaft, die ich zu binden bin versucht, ist eine gültige Eigenschaft, weil ich es in einem Textblock gut anzeigen kann. Registriere ich die Dependency-Eigenschaft falsch?

Was muss ich tun, um den korrekten Wert zu erhalten, der in meinem Code hinter AltNames steht?

+0

Haben Sie versucht, 'AltNames = "{Binding Path = AltNames, Mode = TwoWay}"'? Gibt es verbindliche Fehler im Ausgabefenster zur Laufzeit? – nemesv

+0

@nemesv versucht gerade die Zwei-Wege-Bindung, ohne Glück. Es gibt keine verbindlichen Fehler im Ausgabefenster. – jacobsimeon

+0

Es ist wahrscheinlich, dass dies durch 2 Eigenschaften mit dem gleichen Namen verwirrt wird. Hast du versucht, einen umzubenennen? Die Problemumgehung, die Sie als Antwort markiert haben, scheint wackelig zu sein! – Gusdor

Antwort

11

Dank @Danko für den Einstieg. Ich habe einen Rückruf registriert, um den Wert festzulegen, wenn sich die Eigenschaft ändert.
Hier ist, was ich mit endlich endete:

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

Vielleicht müssen Sie das Argument zu DependencyProperty.Register angeben, wenn die Eigenschaft beeinflusst, wie das Steuerelement gerendert wird. Zum Beispiel:

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

Versuchte dies, und es geht immer noch nicht für mich. Ich habe einen Breakpoint auf den Setter für die AltNames-Eigenschaft platziert und er wird nie ausgeführt. – jacobsimeon

+0

Nun, der Setter wird eigentlich nie ausgeführt, weil die Bindung "hinter den Kulissen" durchgeführt wird. Sie könnten [diesen PropertyMetadata-Konstruktor] (http://msdn.microsoft.com/en-us/library/ms557327.aspx) verwenden, um eine Callback-Methode anzugeben, die ausgeführt wird, wenn die Eigenschaft geändert wird. Überprüfen Sie auch [Wie kann ich WPF-Bindungen debuggen?] (Http://bea.stollnitz.com/blog/?p=52). –

+0

genau das habe ich gerade gemacht. Verwenden des Callbacks, um den Wert festzulegen, der für mich gearbeitet hat. Danke, dass Sie mich auf den richtigen Weg gebracht haben. – jacobsimeon

Verwandte Themen