Tôi đang cố gắng để có được ứng dụng WPF đầu tiên của tôi làm việc bằng cách sử dụng MVVM, và tôi đã nhấn một chút vấn đề ràng buộc.WPF: Thiết lập DataContext của UserControl với Binding không hoạt động trong XAML
Thiết lập là tôi có chế độ xem & chế độ xemMô hình chứa chi tiết người dùng (phụ huynh) và để cố gắng giữ cho mọi thứ đơn giản tôi đã đặt một phần của chế độ xem đó vào chế độ xem riêng & viewModel (con). Chế độ xem con được định nghĩa là UserControl.
Sự cố tôi gặp phải là cách đặt DataContext của chế độ xem con (UserControl). mẹ tôi ViewModel có một tài sản mà cho thấy nhiều con ViewModel, như vậy:
class ParentViewModel: INotifyPropertyChanged
{
public ChildViewModel childViewModel { get; set; }
//...
}
Trong XAML để xem cha mẹ của tôi (trong đó có nó DataContext thiết lập để các ParentViewModel), tôi cố gắng đặt DataContext của quan điểm con như sau:
<views:ChildView
x:Name="ChildView"
DataContext="{Binding childViewModel}"/>
Tuy nhiên, điều này không hiệu quả. DataContext của chế độ xem con được đặt thành cùng DataContext dưới dạng chế độ xem gốc (ví dụ: ParentViewModel), như thể tôi đã không thiết lập nó. Tôi cũng đã thử đặt DataContext ở chế độ xem con, cũng không hoạt động:
<UserControl x:Class="DietRecorder.Client.View.ChildView"
DataContext="childViewModel"
Tôi đã tìm thấy một số cách để giải quyết vấn đề này. Trong chế độ xem con, tôi có thể ràng buộc mọi thứ bằng cách bao gồm ChildViewModel trong đường dẫn:
<SomeControl Visibility="{Binding Path=childViewModel.IsVisible}">
nhưng tôi không muốn con bạn có mức độ nhận thức về cấu trúc phân cấp này. Thiết DataContext trong mã cũng làm việc - tuy nhiên, tôi phải làm điều này sau khi thể hiện quan điểm cha mẹ, nếu không DataContext chỉ bị ghi đè khi tôi gọi Show():
parentView.Show();
parentView.ChildView.DataContext = parentViewModel.childViewModel;
Mã này cũng khiến tôi cảm thấy khó chịu, những gì với vi phạm LOD và tất cả.
Nó chỉ DataContext mà dường như là vấn đề - Tôi có thể ràng buộc những thứ khác ở trẻ em, ví dụ tôi đã cố gắng liên kết các FontSize để một tài sản int chỉ để kiểm tra nó:
<views:ChildView
x:Name="ChildView"
FontSize="{Binding Path=someVal}"/>
Và đó công trình khỏe.
Nhưng tôi chắc chắn ràng buộc DataContext sẽ hoạt động - Tôi đã xem các ví dụ tương tự về loại điều này. Tôi đã bỏ lỡ một cái gì đó hiển nhiên ở đây? Có lý do nào không hiệu quả không? Có lỗi chính tả ở đâu đó không? (Tôi đã đổi tên mọi thứ vì lợi ích của bạn, do đó bạn sẽ không thể giúp tôi ở đó).
Bất kỳ ý tưởng nào được chào đón.
Sửa
Rà soát mã này một lần nữa, có vẻ như tôi đã thực hiện một sai lầm ở đâu đó, như XAML sau trong giao diện cha mẹ bây giờ không xuất hiện để làm việc:
<views:ChildView
x:Name="ChildView"
DataContext="{Binding childViewModel}"/>
Tôi không chắc chắn tại sao tôi không thể làm cho nó hoạt động ban đầu, hoặc những gì tôi có thể đã thay đổi để làm cho nó hoạt động. Có lẽ đó là vấn đề INotifyPropertyChanged như một trong những câu trả lời gợi ý. Oh, trở lên và trở lên ..
Suy nghĩ tốt, nhưng không có niềm vui tôi sợ. Tôi nghĩ rằng nó có thể liên quan đến thứ tự, nhưng chế độ xem conModel sẽ có sẵn khi liên kết xảy ra - và nó hoạt động khi tôi đặt kích thước phông chữ bằng cách sử dụng thuộc tính int, điều này xảy ra cùng một lúc và điều đó không xảy ra t sử dụng PropertyChanged. –