2012-08-21 30 views
8

Tôi đang cố gắng tìm hiểu mẫu MVVM (C#), có nguồn gốc từ nền Windows Forms. Tôi đang sử dụng bộ công cụ ánh sáng MVVM, và cho đến nay tôi nghĩ rằng nó là rực rỡ. Tôi đã thực hiện một số ứng dụng nhỏ, tuy nhiên một điều tôi đang gặp phải là giới thiệu một cái nhìn thứ hai.Ánh sáng MVVM - Nhiều Chế độ xem (và kết nối chúng)

Tôi muốn (ví dụ), có một nút trên MainViewModel của tôi, thông qua một RelayCommand, mở ra một cửa sổ mới - giả sử một cửa sổ "Giới thiệu". Tôi đã làm nhiều giờ nghiên cứu trên web cho điều này tuy nhiên có vẻ như tôi không thể có được AboutViewModel của tôi để giao tiếp với/hiển thị AboutView của tôi.

Tôi đã đặt một bộ nhận tin nhắn trong bộ dựng mã phía sau của AboutView.xaml - tuy nhiên tôi không thể nhận nó để nhận bất kỳ tin nhắn nào từ AboutViewModel, và do đó không thể làm cho nó 'Show()'.

Nếu ai có một ví dụ về một ứng dụng MVVM nhẹ WPF sử dụng nhiều quan điểm cho rằng sẽ là tuyệt vời :)

+0

Một số mã của bạn sẽ cực kỳ hữu ích để tìm câu trả lời ... – EtherDragon

Trả lời

0

Như tôi có thể nhìn thấy bạn muốn có một chuyển hướng trong MVVM ứng dụng của bạn?

Lời đi vào tác giả của MVVM Light-Laurent Bugnion - với post mình về việc sử dụng Navigation Dịch vụ để chuyển đổi Views. Nó thực sự là về Windows Phone & Silverlight nhưng tương tự nên áp dụng cho WPF.

Ngoài ra điều này answer trong câu hỏi liên quan sử dụng phương pháp này.

3

Có hai cách tôi có thể nghĩ để làm điều này một cách dễ dàng

Đầu tiên sẽ được sử dụng một Popup thay vì một mới Window. Ví dụ: tôi thường đặt các thuộc tính trong ViewModel của mình cho PopupContentIsPopupVisible và đặt các giá trị đó bất kỳ lúc nào tôi muốn hiển thị điều khiển Popup của mình. Ví dụ, một lệnh ShowAboutPopup rơle có thể chạy một cái gì đó như thế này:

void ShowAboutPopup() 
{ 
    PopupContent = new AboutViewModel(); 
    IsPopupVisible = true; 
} 

Bạn có thể hiển thị nó sử dụng một đối tượng Popup, hoặc tùy chỉnh UserControl. Tôi thích sử dụng riêng custom Popup UserControl của tôi, mà thường sẽ kết thúc như thế này:

<Window> 
    <Canvas x:Name="RootPanel"> 
     <SomePanel> 
      <!-- Regular content goes here --> 
     </SomePanel> 

     <local:PopupPanel Content="{Binding PopupContent}" 
      local:PopupPanel.IsPopupVisible="{Binding IsPopupVisible}" 
      local:PopupPanel.PopupParent="{Binding ElementName=RootPanel}" /> 
    </Canvas> 
</Window> 

Thuộc tính PopupContent là một ViewModel (chẳng hạn như một AboutViewModel), và DataTemplates được sử dụng để nói với WPF để vẽ cụ thể ViewModels với cụ Views

<Window.Resources> 
    <DataTemplate DataType="{x:Type local:AboutViewModel}"> 
     <local:AboutView /> 
    </DataTemplate> 
</Window.Resources> 

phương pháp khác là phải có một số loại ApplicationViewModel chạy khi khởi động, và chịu trách nhiệm về trạng thái ứng dụng tổng thể, trong đó bao gồm mà cửa sổ (s) được mở.

Thông thường tôi thích có một đơn ApplicationView có chứa một ContentControl để hiển thị các trang hiện

<Window> 
    <ContentControl Content="{Binding CurrentViewModel}" /> 
</Window> 

tuy nhiên nó cũng có thể được sử dụng để quản lý nhiều cửa sổ. Nếu bạn sử dụng nó để quản lý nhiều đối tượng Window, hãy cảnh báo rằng đây sẽ không phải là ViewModel thuần túy bởi vì nó sẽ cần truy cập vào một số đối tượng cụ thể cho xem và tham chiếu đối tượng giao diện người dùng không phải là một cái gì đó ViewModel. Ví dụ, nó có thể đăng ký để nhận được thông báo ShowWindow và khi nhận được những tin nhắn đó, nó sẽ tạo Chế độ xem được chỉ định và hiển thị nó, đồng thời có thể ẩn cửa sổ hiện tại.

Cá nhân, tôi cố gắng tránh nhiều cửa sổ nhiều nhất có thể. Phương pháp thông thường của tôi là có một Chế độ xem duy nhất chứa các đối tượng ứng dụng nhất quán cho bất kỳ trang nào và một số nội dung động có thay đổi là ContentControl. Tôi có một số example using this navigation style on my blog nếu bạn quan tâm

+1

+1 cho nỗ lực và "trung tâm". –

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