2015-07-17 18 views
8

Ich habe ein benutzerdefiniertes Steuerelement namens AddressForm erstellt, das von Control erbt. Das Steuerelement wird verwendet, um die Felder für ein IAddress-Objekt anzuzeigen.WPF-Benutzersteuerelement: DependencyProperty wird nie festgelegt (nur bei einer von vielen Eigenschaften)

Ursprünglich habe ich diese Kontrolle in Silverlight, jetzt versuche ich, es .net 4.5

Die Steuerung definiert 9 verschiedene Abhängigkeitseigenschaften, und alle bis auf einen ordnungsgemäß funktioniert in WPF arbeiten zu erhalten. Natürlich funktioniert das Adressobjekt selbst nicht!

Die Address-Eigenschaft des Steuerelements erhält niemals einen Wert. Ich habe einen Break-Point in der Adresse Getter, die Eigenschaft wird aufgerufen, das Adressobjekt ist nicht null, aber das Steuerelement erhält es nicht.

Im Ausgabebild gibt es keine Ausnahmen und keine Fehlermeldungen.

Steuerung:

public class AddressForm : Control, INotifyPropertyChanged 
{ 
    [...] 

    public static readonly DependencyProperty AddressProperty = DependencyProperty.Register("Address", typeof(IAddress), typeof(AddressForm), new PropertyMetadata(AddressChanged)); 
    public IAddress Address 
    { 
     get { return (IAddress)GetValue(AddressProperty); } 
     set { SetValue(AddressProperty, value); } 
    } 

    private static void AddressChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     //break-point here never gets hit 
     AddressForm form = d as AddressForm; 
     if (form != null) 
      form.OnAddressSet(); 
    } 

    private void OnAddressSet() 
    { 
     //break-point here never gets hit 
     if (StateProvince != null && Address != null) 
     SelectedStateProvince = StateProvince.Where(A => A.StateProvince == Address.StateProvince).FirstOrDefault(); 
    } 

    [...] 
} 

(Andere DependencyProperties werden in der gleichen Weise eingestellt und korrekt arbeiten.)

XAML:

<Address:AddressForm Address="{Binding SelectedMFG.dms_Address, Mode=TwoWay}" ... /> 

die Art der SelectedMFG ist scm_MFG

Datenobjekte:

public partial class scm_MFG 
{ 
    [...] 
    public virtual dms_Address dms_Address { get; set; } //break-point here never enables? Generated code from Entity TT 

    //Another attempt, trying to determine if the IAddress cast was the cause of the issue 
    //Address="{Binding SelectedMFG.OtherAddress}" 
    public IAddress OtherAddress 
    { 
     get { 
      return dms_Address as IAddress; //break-point here gets hit. dms_Address is not null. Control never receives the value. 
     } 
    } 
} 

public partial class dms_Address : IAddress, INotifyPropertyChanged { ... } 

Meine Versuche:

ich versucht habe, die dms_Address Eigenschaft verschiedene Arten zugreifen. Ich kann die Werte der Adresse in einem Textfeld anzeigen, das sagt mir, dass es kein Problem mit dem Datenkontext gibt.

<TextBox Text="{Binding SelectedMFG.dms_Address.StreetName, Mode=TwoWay}" /> <!-- this value displays --> 

Ich habe auch versucht, die Registrierungs-Metadaten der Abhängigkeitseigenschaft zu ändern. Ich bin mir nicht sicher, welche die richtige zu verwenden ist:

PropertyMetadata, UIPropertyMetadata oder FrameworkPropertyMetadata

DependencyProperty.Register("Address", typeof(IAddress), typeof(AddressForm), new PropertyMetadata(AddressChanged)); 
DependencyProperty.Register("Address", typeof(IAddress), typeof(AddressForm), new PropertyMetadata(null, AddressChanged)); 
DependencyProperty.Register("Address", typeof(IAddress), typeof(AddressForm), new UIPropertyMetadata(AddressChanged)); 
DependencyProperty.Register("Address", typeof(IAddress), typeof(AddressForm), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.Inherits, AddressChanged)); 
// and other FrameworkPropertyMetadataOptions, no difference 
.

ich glaube ich, alles richtig gemacht haben und dass diese arbeiten sollte.

Fällt irgendetwas als seltsam oder falsch aus?

Antwort

2

Ich fand eine Lösung.

änderte ich die Adresse Abhängigkeitseigenschaft auf dem Formular von iAddress zu Objekt. Jetzt wird die Eigenschaft festgelegt.Es scheint, dass, obwohl ich ein iAddress Objekt zurückkehrt, das Objekt, dass das Formular tatsächlich erhält ein EntityWrapper für dms_Address.

Dieser Entity-Wrapper wird auch auf IAddress umgewandelt, so dass ich nicht sicher bin, warum es sich so verhielt. Nur eine andere Entität, denke ich.