2011-11-14 22 views
6

Có thể kết nối View và ViewModel bằng cả một DataContext Declarative và một mẫu dữ liệu không?Đấu nối Chế độ xem MVVM và Chế độ xemMô hình bằng cách sử dụng DataContext Declarative cho Mẫu thiết kế và thời gian và dữ liệu cho thời gian chạy?

Mục tiêu: Tôi muốn ghép nối Chế độ xem với một Chế độ xem riêng cho thiết kế và thời gian khác tại thời gian chạy. Hiện tại, sử dụng một DataContext Declarative cho một máy ảo thời gian thiết kế và một VM được chỉ định cho Data-Template cho thời gian chạy không hoạt động như mong đợi.

nền - Có rất nhiều cách để dây lên một Xem và ViewModel bao gồm:

A.) khai báo rõ ViewModel DataContext trong của Xem XAML. Kỹ thuật này rất hữu ích tại Design-Time bằng cách sử dụng hàm tạo ít tham số để truyền dữ liệu giả.

<UserControl.DataContext> 
    <my: BrowseAssetsViewModel /> 
</UserControl.DataContext> 

B.) lập trình chỉ định ViewModel, Xem và DataContext.

// …Setup code 
BrowseAssetsViewModel viewModel = new BrowseAssetsViewModel(assetRegistry, domains); 
BrowseAssetsView view = new BrowseAssetsView(); 
view.DataContext = viewModel; 

Khi tiếp cận B được sử dụng kết hợp với cách tiếp cận A, tại thời gian chạy WPF đè DataContext mặc định theo quy định tại pháp tiếp cận Một sử dụng phiên bản của ViewModel với các nhà xây dựng tham số quy định tại pháp tiếp cận B.

C.) Xác định Mẫu dữ liệu cho liên kết View-ViewModel Bằng cách liên kết Chế độ xem và Chế độ xem trong ứng dụng.XAML Application.Resources, WPF có thể kết nối Chế độ xem chính xác dựa trên loại của ViewModel.

<DataTemplate DataType="{x:Type vm: BrowseAssetsViewModel }"> 
    <vw: BrowseAssetsView /> 
</DataTemplate> 

Nếu một tài sản ViewModel được ràng buộc với một điều khiển ContentPresenter, WPF sẽ dây-up View tương ứng (dựa trên loại của ViewModel) và đặt nó trong ContentPresenter. Điều này rất hữu ích trong kịch bản “ViewModel-first”, nơi ViewModel được trình bày và WPF giải quyết và kết nối chính xác View bằng cách kiểm tra kiểu ViewModel được trình bày.

Vấn đề - Khi sử dụng phương pháp C này kết hợp với phương pháp A, WPF giải quyết chế độ xem chính xác nhưng có vẻ sau đó truy vấn lại View, gọi ViewModel được khai báo xác định thông qua hàm tạo tham số-ít (Phương pháp A) , do đó sẽ ghi đè thuộc tính ViewModel hiện tại!

Câu hỏi - Có cách nào để sử dụng các kỹ thuật này (C và A) cùng nhau mà không A vô tình ghi đè thuộc tính C ViewModel không?

+0

Tại sao bạn tuyên bố chỉ định DataContext của ViewModel trong XAML của Chế độ xem nếu bạn không muốn tuyên bố đó diễn ra? –

+0

Mục đích là để tìm một kỹ thuật hỗ trợ cả hai chế độ ViewModels giả (A) thời gian thiết kế và độ phân giải DataTemplate (C) tại thời gian chạy. –

Trả lời

8

Bạn có thể xác định rằng DataContext là trong trường hợp Một tập hợp chỉ duy nhất tại thời gian thiết kế, như vậy:

<UserControl ... 
    d:DataContext="{d:DesignInstance my:BrowseAssetsViewModel}" 
> 

Để biết chi tiết, xem Using a DesignInstance... trên MSDN.

+3

Ngoài ra, hãy thêm 'IsDesignTimeCreatable = True' để nó hiển thị trong VS. Ví dụ: d: DataContext = "{d: DesignInstance Type = local: DuyệtAssetsViewModel, IsDesignTimeCreatable = True}" –

+0

Câu trả lời này, kết hợp với IsDesignTimeCreatable = True được đề cập trong nhận xét đã giải quyết được sự cố. Cảm ơn cả hai bạn. -Larry –