2009-06-10 6 views
30

Bir mülke bağlanabilirim, ancak başka bir mülkte bir mülk kullanamaz. Neden olmasın? Örneğin.WPF: Yuvalanmış bir özelliğe nasıl bağlanır?

<Window DataContext="{Binding RelativeSource={RelativeSource Self}}"...> 
... 
    <!--Doesn't work--> 
    <TextBox Text="{Binding Path=ParentProperty.ChildProperty,Mode=TwoWay}" 
      Width="30"/> 

(Not:.. Ben usta-ayrıntılarını veya bir şey yapmaya çalışmıyorum Hem özellikler standart CLR özellikleridir)

Güncelleme: sorun benim ParentProperty XAML olmanın bir nesneye bağlı olduğunu oldu başlatıldı. Ne yazık ki bu nesne, daha sonra XAML dosyasında Bağlama, daha sonra tanımlandı, bu nedenle, ParentProperty tarafından Bağlama tarafından okunduğunda nesne null oldu. düzeni berbat olur XAML dosyasını yeniden düzenleyerek beri, düşünebildiğim tek çözüm kod arkada içinde Bağlama tanımlamak oldu:

<TextBox x:Name="txt" Width="30"/> 

// after calling InitializeComponent() 
txt.SetBinding(TextBox.TextProperty, "ParentProperty.ChildProperty"); 

cevap

22

Ben ParentPropertyBinding sonra değiştiriliyor olmasıdır düşünebildiğim oluşturuldu ve değişiklik bildirimini desteklemiyor. Zincirdeki her özellik, bir DependencyProperty olması ya da INotifyPropertyChanged uygulanarak olsun, değişiklik bildirimini desteklemelidir.

+0

Evet, bunun sebebi gibi görünüyor. ParentProperty salt okunurdur, ancak XAML'de başlatılan belirli bir denetime bağlıdır. Bu nesne, Bağlamadan Sonra .xaml dosyasında tanımlanmıştır, böylece ParentProperty çağrıldığında, NullReferenceException attı. Fark etmedim çünkü WPF onu yuttu. Çıkış penceresini kontrol etmeliydim! – Qwertie

+0

Artık yeni bir yap-bozum var - düzeni hizalamadan XAML'deki nesneleri doğru sırayla nasıl tanımlayabilirsiniz. – Qwertie

+0

Ya da bir şekilde, önce özelliği okur önce Pencere tamamen başlatılıncaya kadar bekle bekleyebilir miyim? {Binding ElementName = xyz, ...} kullandığımda, xyz daha sonra XAML dosyasında tanımlanmış olsa bile çalışır. Garip o zaman (xyz elementini kullanan) ParentProperty, xyz'nin daha sonra XAML dosyasında tanımlandığından dolayı çalışmaz. – Qwertie

3

Hem ParentProperty hem de sınıfınız INotifyPropertyChanged uygulandı mı?

public class ParentProperty : INotifyPropertyChanged 
    { 
     private string m_ChildProperty; 

     public string ChildProperty 
     { 
      get 
      { 
       return this.m_ChildProperty; 
      } 

      set 
      { 
       if (value != this.m_ChildProperty) 
       { 
        this.m_ChildProperty = value; 
        NotifyPropertyChanged("ChildProperty"); 
       } 
      } 
     } 

     #region INotifyPropertyChanged Members 

     #endregion 
    } 

    public partial class TestClass : INotifyPropertyChanged 
    { 
     private ParentProperty m_ParentProperty; 

     public ParentProperty ParentProperty 
     { 
      get 
      { 
       return this.m_ParentProperty; 
      } 

      set 
      { 
       if (value != this.m_ParentProperty) 
       { 
        this.m_ParentProperty = value; 
        NotifyPropertyChanged("ParentProperty"); 
       } 
      } 
     } 
} 
    public TestClass() 

    { 
     InitializeComponent(); 
     DataContext = this; 
     ParentProperty = new ParentProperty(); 
     ParentProperty.ChildProperty = new ChildProperty(); 

     #region INotifyPropertyChanged Members 
     #endregion 
    } 
36

Ayrıca (o optimal çözüm olmadığını bilmiyorum, ama en azından INotifyPropertyChanged uygulanması haricinde elle CodeBehind herhangi bir işlem yapmanız gerekmez) XAML TextBox için DataContext ayarlayabilirsiniz. senin TextBox zaten DataContext (DataContext kalıtsal) sahip olduğunda böyle kod yazmak:

<TextBox 
    DataContext="{Binding Path=ParentProperty}" 
    Text="{Binding Path=ChildProperty, Mode=TwoWay}" 
    Width="30"/> 

TextBox için DataContext kadar 'tesis' olmayacak Text özelliği için bağlayıcı hazır olmadığını unutmayın - Eğer FallbackValue='error' ekleyebilir Binding parametresi olarak - bağlamanın tamam olup olmadığını size gösterecek bir gösterge gibi olacaktır.

+4

+1 – Qwertie