2009-06-10 53 views
30

Tôi có thể liên kết với một thuộc tính, chứ không phải thuộc tính trong một thuộc tính khác. Tại sao không? ví dụ.WPF: Cách liên kết với thuộc tính lồng nhau?

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

(Lưu ý:.. Tôi không cố gắng để làm master-chi tiết hoặc bất cứ điều gì Cả hai thuộc tính là tài sản CLR tiêu chuẩn)

Cập nhật: vấn đề là ParentProperty của tôi phụ thuộc vào một đối tượng trong XAML là được khởi tạo. Thật không may là đối tượng đã được định nghĩa sau trong tập tin XAML hơn là Binding, vì vậy đối tượng là null tại thời điểm ParentProperty của tôi được đọc bởi Binding. Kể từ khi sắp xếp lại các tập tin XAML sẽ vít lên bố trí, giải pháp duy nhất tôi có thể nghĩ đến là để xác định các ràng buộc trong code-behind:

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

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

Trả lời

22

Tất cả tôi có thể nghĩ đến là ParentProperty đang được thay đổi sau khi Binding được tạo và không hỗ trợ thông báo thay đổi. Mọi thuộc tính trong chuỗi phải hỗ trợ thông báo thay đổi, cho dù đó là do một số DependencyProperty hoặc bằng cách triển khai INotifyPropertyChanged.

+0

Vâng, có vẻ như đó là lý do. ParentProperty là chỉ đọc nhưng nó phụ thuộc vào một điều khiển nhất định trong XAML được khởi tạo. Đối tượng này được định nghĩa trong tệp .xaml SAU KHI Ràng buộc, vì vậy khi ParentProperty được gọi, nó đã ném NullReferenceException. Tôi đã không nhận thấy bởi vì WPF nuốt nó. Tôi nên kiểm tra cửa sổ đầu ra! – Qwertie

+0

Bây giờ tôi có một câu đố mới - cách xác định các đối tượng theo thứ tự đúng trong XAML mà không làm rối tung lên bố cục. – Qwertie

+0

Hoặc tôi có thể bằng cách nào đó làm cho sự ràng buộc chờ đợi cho đến khi cửa sổ được khởi tạo hoàn toàn trước khi nó đọc thuộc tính? Khi tôi sử dụng {Binding ElementName = xyz, ...}, nó hoạt động ngay cả khi xyz được định nghĩa sau trong tệp XAML. Strange sau đó ParentProperty của tôi (sử dụng phần tử xyz) không hoạt động chỉ vì xyz được định nghĩa sau trong tệp XAML. – Qwertie

3

Làm cả ParentProperty và lớp của bạn đều triển khai INotifyPropertyChanged?

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

Bạn cũng có thể thiết lập DataContext cho TextBox trong XAML (Tôi không biết nếu đó là giải pháp tối ưu, nhưng ít nhất bạn không cần phải làm bất cứ điều gì bằng tay trong codebehind trừ thực hiện INotifyPropertyChanged). Khi TextBox của bạn có đã DataContext (thừa hưởng DataContext) bạn viết mã như thế này:

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

Hãy nhận biết rằng cho đến khi DataContext của bạn cho TextBox chưa sẵn sàng ràng buộc cho Text bất động sản sẽ không được 'thiết lập' - bạn có thể thêm FallbackValue='error' như tham số Binding - nó sẽ là một cái gì đó giống như chỉ số đó sẽ cho bạn thấy nếu ràng buộc là OK hay không.

+4

+1 cho mẹo về FallbackValue :) – Qwertie

Các vấn đề liên quan