2015-07-17 12 views
8

Denetimden devralan AddressForm adlı bir özel denetim yaptık. Denetim, bir IAddress nesnesinin alanlarını görüntülemek için kullanılır. WPF Özel Denetim: DependencyProperty asla Set (birçok özellikten yalnızca 1'inde)

Başlangıçta ben şimdi bunun .net 4.5

kontrolü 9 farklı bağımlılık özelliklerini tanımlayan WPF çalışma almak için çalışıyorum ve biri hariç hepsi doğru çalıştığından, Silverlight, bu denetimi yaptı. Doğal olarak, çalışmayan adres Adres nesnesidir!

Denetimin Adres özelliği hiçbir zaman bir değer almaz. Adresin Getter'inde bir break-point koydum, özellik çağrılıyor, adres nesnesi boş değil, ancak kontrol bunu almıyor.

Çıkış ekranında istisnalar ve hata mesajları yoktur.

Kontrol:

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

    [...] 
} 

(diğer DependencyProperties doğru aynı şekilde ayarlanır ve çalışma edilmiştir.)

xaml:

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

SelectedMFG türü scm_MFG olan

Veri nesneleri:

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

Benim girişimleri: Ben dms_Address özelliği farklı yollar erişen denedi

. Adresin değerlerini bir metin kutusunda görüntüleyebilirim, bu da bana datacontext ile ilgili bir sorun olmadığını söyler.

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

Ben de bağımlılık tesisin kayıt meta verilerini değiştirmeyi denedi. PropertyMetadata, UIPropertyMetadata veya 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 

: Kullanmak doğru olacağı emin değilim.

Her şeyi doğru yapmış inanmak ve bu çalışma gerektiğini.

Bir şey garip veya yanlış olarak atlanıyor mu?

cevap

2

Bir çözüm buldum.

Ben Nesne için IAddress gelen formdaki Adres Bağımlılık Mülkiyet değiştirdi. Şimdi mülk ayarlanıyor.Görünüşe göre bir IAddress nesnesini döndürmekteyken, formun gerçekten aldığı nesne dms_Address için EntityWrapper olur.

Bu varlık sarıcı IAddress'a da yayınlanacak, bu yüzden neden böyle davrandığından emin değilim. Sanırım başka bir varlık var.