2013-08-14 41 views
10

Tôi có một ViewModel với kiểu thuộc tính phức tạp và muốn ràng buộc chế độ xem của tôi với thuộc tính lồng nhau của đối tượng này.Thông báo cập nhật liên kết WPF cho thuộc tính lồng nhau khi thuộc tính cha mẹ thay đổi

My ViewModel đang triển khai INotifyPropertyChanged (hoặc được mở rộng BaseViewModel đang triển khai). Lớp thuộc tính cha mẹ không triển khai INotifyPropertyChanged.

Khi tôi cập nhật giá trị của thuộc tính gốc, thuộc tính lồng nhau không cập nhật. Bạn có thể cho tôi biết làm thế nào tôi có thể thực hiện chức năng này?

ViewModel

public class ViewModel : BaseViewModel 
{ 
    private Car _myCarProperty; 

    public Car MyCarProperty 
    { 
     get { return _myCarProperty; } 
     set 
     { 
      if (value == _myCarProperty) return; 

      _myCarProperty = value; 
      OnPropertyChanged(); 
     } 
    } 
} 

Binding trong Xem

<TextBlock Text="{Binding Path=MyCarProperty.Manufacturer}" /> 

Khi tôi thay đổi giá trị của MyCarProperty View không cập nhật.

Cảm ơn bạn đã trợ giúp!

Edit: OnPropertyChanged() thực hiện

#region INotifyPropertyChanged 

public event PropertyChangedEventHandler PropertyChanged; 

[NotifyPropertyChangedInvocator] 
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
{ 
    PropertyChangedEventHandler handler = PropertyChanged; 
    if (handler != null) 
    { 
     handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

#endregion INotifyPropertyChanged 
+0

bạn có thông báo cho tài sản trẻ em không? –

+0

Lớp 'Xe' không triển khai' INotifyPropertyChanged'. Nhưng tôi không thay đổi thuộc tính 'Manufacturer', tôi thay đổi thuộc tính' MyCarProperty', và vì vậy tôi hy vọng rằng sự kiện OnNotifyPropertyChanged sẽ kích hoạt cập nhật giá trị?- vui lòng xem câu hỏi đã chỉnh sửa của tôi. –

+1

Bạn có thể cho chúng tôi biết cách OnPropertyChanged được triển khai không? –

Trả lời

15

"Lớp Ô tô không thực hiện INotifyPropertyChanged Nhưng tôi không thay đổi sản xuất tài sản, tôi thay đổi sở hữu MyCarProperty, và vì vậy tôi hy vọng rằng sự kiện OnNotifyPropertyChanged sẽ kích hoạt cập nhật giá trị? "

Không, nó sẽ không kích hoạt cập nhật giá trị xuống cấp. Các ràng buộc không lắng nghe các thay đổi thuộc tính cho toàn bộ đường dẫn, chúng chỉ lắng nghe đối tượng mà chúng bị ràng buộc.

Tôi thấy một vài tùy chọn khỏi đỉnh đầu của tôi (theo thứ tự ưu tiên của tôi khi tôi chạy vào trong này):

  1. Bind để xe, không phải là tài sản phụ, và tạo ra một data template rằng màn hình những gì bạn muốn ra khỏi nó.
  2. Thủ công đá liên kết bằng cách gọi UpdateTarget trên số BindingExpression khi bạn cần.

Tôi biết có vẻ như có rất nhiều hơn để tìm hiểu về các mẫu dữ liệu tuyến đường, nhưng tôi hứa với bạn rằng các mẫu dữ liệu sẽ chứng minh bao la mạnh hơn, khả năng mở rộng, bảo trì, và hữu ích hơn bằng tay đá bindings như bạn làm việc nhiều hơn trong WPF. (Ngoài ra, khi bạn hiểu chúng, tôi nghĩ rằng chúng thực sự là ít hơn hoạt động hơn so với gắn kết thủ công).

Chúc may mắn!

+0

Cảm ơn Greg! Tôi biết về các mẫu dữ liệu và không nên có bất kỳ vấn đề nào với chúng. Tôi đã có cùng một vấn đề một thời gian trước và tôi nhớ rằng tôi đã tìm thấy một cái gì đó trong quá khứ mà âm thanh như "ràng buộc tìm kiếm sâu", nhưng tôi đoán nó chỉ là 'VeryObservableCollection' tôi tìm thấy [ở đây] (http://stackoverflow.com/question/6542035/listview-not-updated-correct-with-observablecollection) - không hỗ trợ vấn đề này. Tôi hy vọng rằng một cái gì đó tương tự sẽ tồn tại. Nhưng ý tưởng mẫu dữ liệu hoàn hảo :) –

+0

Xin lỗi, cái gì? WPF không nghe những thay đổi dọc theo đường dẫn? Tôi ước gì tôi biết điều này trước khi tôi bắt đầu sử dụng những con đường xích lô ở khắp mọi nơi. Này, dừng lại. Nó hoạt động! ;) –

+0

@Greg D, liên kết "mẫu dữ liệu" đã lỗi thời. Xin lỗi, tôi chỉ cảm thấy buồn chán. –

3

Tôi không phải là một chuyên gia WPF, nhưng tôi nghĩ rằng đó là bởi vì bạn đã chọn con đường sai lầm.

<TextBlock Text="{Binding Path=MyCarProperty, Value=Manufacturer}" /> 

update:.

<TextBlock Text="{Binding Source=MyCarProperty, Path=Manufacturer}" /> 
+0

Theo [this] (http://www.nbdtech.com/Free/WpfBinding.pdf) không có thuộc tính value. –

+0

Nhân tiện: Binding đang hoạt động, chỉ các bản cập nhật giá trị không được lan truyền. –

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