2010-04-18 32 views
5

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

Trả lời

2

Tôi nghi ngờ đó là vì thuộc tính childViewModel không tăng sự kiện PropertyChanged. Khi ràng buộc được đánh giá, có thể thuộc tính này là null (trong trường hợp đó DataContext sẽ chỉ rơi trở lại giá trị của cha). Khi childViewModel được khởi tạo sau này, không có sự kiện PropertyChanged được nâng lên, và ràng buộc không bao giờ được thông báo rằng bây giờ có một DataContext.

Cố gắng tăng sự kiện PropertyChanged trong thuộc tính childViewModel.

Chúc mừng, Laurent

+0

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. –

2

tôi đang tìm kiếm điều tương tự và tôi thấy một cách để làm việc đó. Về cơ bản, tôi bị ràng buộc DataContext của đứa trẻ để DataContext của một số phụ huynh (cửa sổ) sử dụng

DataContext="{Binding ElementName=_topLevel, Path=DataContext.childViewModel}" 

nơi tôi đã thiết x:Name="_topLevel" trên một số phụ huynh kiểm soát (cửa sổ).

Tôi đã cố gắng sử dụng RelativeSource/FindAncestor thay vì ElementName nhưng nó không hoạt động - nhưng đó có lẽ là lỗi của tôi.

Cảm thấy như bị hack với tôi, nhưng tốt hơn là ràng buộc với mô hình chế độ xem cấp cao nhất.

+0

Mặc dù tôi chưa thử nó, điều đó sẽ hoạt động, vì vậy tôi sẽ cung cấp cho bạn +1 cho nỗ lực sau tất cả thời gian này - nhưng giải pháp này có cùng một vấn đề như một trong các giải pháp tôi đã đề xuất ở trên, đó là con biết về cha mẹ. Đó chỉ là một mùi hôi hoặc một vấn đề thực sự, tùy thuộc vào việc bạn sử dụng đứa trẻ trong quan điểm cha mẹ khác nhau hay không. Khi kiểm tra mã của tôi cho câu trả lời này, tôi phát hiện ra nó bây giờ hoạt động, mặc dù tôi không chắc chắn lý do tại sao - xem chỉnh sửa để biết chi tiết. –

2

Đây không phải là câu trả lời cho câu hỏi, nhưng có thể giúp người khác trong cùng hoàn cảnh.

tôi nhấn chính xác vấn đề này và phát hiện ra rằng cách tiếp cận

parentView.ChildView.DataContext = parentViewModel.childViewModel; 

làm việc (mặc dù tôi thấy rằng nó đã làm việc trước khi thực hiện Show()), nhưng có cảm thấy ghê tởm như vậy về nó như là hỏi ban đầu để thử

DataContext="{Binding ElementName=_topLevel, Path=DataContext.childViewModel}" 

cách tiếp cận, dường như cũng hoạt động. Nhưng sau đó tôi đã cố gắng quay trở lại mã ban đầu và XAML ban đầu một lần nữa, và bây giờ nó đột nhiên cũng làm việc. Điều này phản ánh hành vi của người hỏi ban đầu, nơi tác giả nghĩ rằng họ đã phạm sai lầm ở đâu đó vì XAML dường như bắt đầu hoạt động không có lý do rõ ràng.

Thay đổi duy nhất tôi có thể thấy là Visual Studio hiện đang hiển thị dữ liệu mẫu trong UserControl tại thời điểm thiết kế, vì vậy nó đã lưu trữ một số dữ liệu mẫu ở đâu đó và dường như làm cho nó hoạt động. Tôi không chắc chắn về hai sự thay đổi này đã xảy ra, thật không may.

Sự xuất hiện của dữ liệu mẫu khiến tôi tự hỏi liệu sự cố có được kết nối với việc sử dụng d: DataContext mà tôi có trong tệp XAML của cha mẹ và con không, nhưng đó chỉ là suy đoán.

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