2015-07-17 21 views
8

Ho creato un controllo personalizzato chiamato AddressForm, che eredita da Control. Il controllo viene utilizzato per visualizzare i campi per un oggetto IAddress.Controllo personalizzato WPF: DependencyProperty mai impostato (solo su 1 di molte proprietà)

Originariamente ho fatto questo controllo in Silverlight, ora sto cercando di farlo funzionare in WPF .net 4.5

Il controllo definisce 9 differenti proprietà di dipendenza, e tutti tranne uno funziona correttamente. Naturalmente, quello che non funziona è l'oggetto Address stesso!

La proprietà Address del controllo non riceve mai un valore. Inserisco un break-point nel Getter dell'indirizzo, la proprietà viene richiamata, l'oggetto indirizzo non è nullo, ma il controllo non lo riceve.

Non ci sono eccezioni, né messaggi di errore nella schermata di output.

Controllo:

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

    [...] 
} 

(Altre DependencyProperties sono impostati allo stesso modo e funzionano correttamente.)

xaml:

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

il tipo di SelectedMFG è scm_MFG

oggetti dati:

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 { ... } 

miei tentativi:

ho provato l'accesso alle proprietà modi diversi dms_Address. Posso visualizzare i valori dell'indirizzo in una casella di testo, che mi dice che non ci sono problemi con il datacontext.

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

Ho anche provato a modificare i metadati di registrazione della proprietà di dipendenza. non sono sicuro che è quello corretto da utilizzare: PropertyMetadata, UIPropertyMetadata o 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 

.

Io credo ho fatto tutto correttamente e che questo dovrebbe funzionare.

Qualcosa salta fuori come strano o errato?

risposta

2

Ho trovato una soluzione.

ho cambiato l'indirizzo proprietà di dipendenza sul modulo da IAddress a oggetto. Ora la proprietà si sta preparando.Sembra che anche se stavo restituendo un oggetto IAddress, l'oggetto che il modulo sta effettivamente ricevendo è un EntityWrapper per dms_Address.

Questo wrapper dell'entità verrà convertito in IAddress, quindi non sono sicuro del motivo per cui si è comportato in questo modo. Ho solo pensato a un'altra Entity.