2013-05-14 49 views
7

Tôi đang xây dựng một dự án và một trong những vấn đề lớn nhất mà tôi đã gặp phải cho đến bây giờ là điều hướng.
Tôi đã tìm một số thời gian bây giờ cho các ví dụ về điều hướng caliburn.micro/mvvm, nhưng tất cả chúng dường như thực sự dài và tôi thực sự không thể hiểu nhiều về nó (người mới bắt đầu ở đây!).WPF Caliburn.Micro/mvvm Navigation

Một số thông tin về dự án của tôi:
Tôi muốn có cửa sổ/vỏ bên ngoài, với liên kết/tab menu mở trang theo nút được nhấp vào bên trong phần vỏ và có thể mở thay đổi trang từ bên trong một trang.

Tôi hiện có: ShellViewModel.cs, MainViewModel.cs, mô hình của tôi và chế độ xem của tôi. Hiện tại, tất cả những gì tôi cần biết là làm thế nào để tải MainViewModel bên trong shellviewmodel khi khởi động (sử dụng contentcontrol/frames ...) và cách di chuyển từ trang này sang trang khác.

Bạn cũng có thể viết nó theo điểm và liên kết tôi với một số ví dụ hữu ích và tôi tin rằng tôi có thể tiếp tục từ đó. Tốt nhất là bạn nên giải thích kỹ lưỡng về nội dung nếu có thể.

Trả lời

10

Đã đọc khoảng Conductors and Screens trên tài liệu chính thức.

Là một ví dụ đơn giản, bạn ShellViewModel có thể là một Conductor của một màn hình hoạt động (tức là chỉ có một màn hình trở nên active/inactive tại một thời điểm):

public class ShellViewModel : Conductor<IScreen>.Collection.OneActive 

Sau đó bạn có thể thiết lập ActiveItem của Conductor để trường hợp xem mô hình mà bạn muốn như đang hoạt động:

this.ActivateItem(myMainViewModel); 

một loại bộ sưu tập Conductor cũng cung cấp một bộ sưu tập Items mà bạn có thể cư khi bạn khởi tạo cửa sổ mới. Chế độ xem trong bộ sưu tập Items này có thể là các bộ sưu tập hiện đang bị hủy kích hoạt nhưng chưa đóng và bạn có thể kích hoạt chúng bằng cách sử dụng ActivateItem như trên. Nó cũng làm cho nó rất dễ dàng để tạo ra một trình đơn của các cửa sổ mở bằng cách sử dụng một ItemsControl với x:Name="Items" trong của bạn ShellView.

Sau đó, để tạo ra các ShellView, bạn có thể sử dụng một ContentControl và đặt tên nó là giống như ActiveItem bất động sản, và Caliburn.Micro sẽ làm phần còn lại:

<ContentControl x:Name="ActiveItem" /> 

Sau đó bạn có thể đáp ứng kích hoạt/hủy kích hoạt trong MainViewModel của bạn bằng cách ghi đè OnActivate/OnDeactivate trong lớp đó.

+0

Vâng, bạn chắc chắn đã đơn giản hóa ý tưởng! Là một bộ sưu tập 'Conductor' loại một cái gì đó tôi nên sử dụng khi tôi muốn thêm" lạc hậu "/" chuyển tiếp "chức năng ví dụ? Ngoài ra, làm cách nào để chuyển đến một trang khác trên một lần nhấp nút? Tôi có sử dụng lệnh không? Nếu vậy, EventAggerator được sử dụng trong hầu hết các ví dụ khác có ích gì? – Asaf

+0

Cho dù bạn sử dụng Conductor hay một trong những bộ thu Conductors sẽ phụ thuộc vào nếu bạn muốn màn hình prev/next của bạn được đóng lại hoặc chỉ ngừng hoạt động. Để đi đến một trang khác, bạn chỉ cần gọi phương thức ActivateItem. Hãy xem các Hành động trên các trang tài liệu để gọi các phương thức trên các kiểu xem của bạn từ các khung nhìn của bạn. – devdigital

+0

Cảm ơn. Bạn có thể vui lòng cho tôi biết cách tôi có thể thay đổi chế độ xem hiện tại sang chế độ xem khác trong một chế độ xem khác (thay đổi thành NewViewModel khỏi việc sử dụng OldVieModel chẳng hạn.) – Asaf

4

Trong ShellView bạn sử dụng một điều khiển nội dung như thế này:

<ShellView xmlns:cal="http://caliburnproject.org/"> 
    <StackPanel> 
      <Button Content="Show other view" cal:Message.Attach="ShowOtherView" /> 
      <ContentControl cal:View.Model="{Binding Child}" /> 
    </StackPanel> 
</ShellView> 

ShellViewModel:

public class ShellViewModel : Screen 
{ 
    private object Child; 

    public object Child 
    { 
      get{ return child; } 
      set 
      { 
       if(child == value) 
        return; 
       child = value; 
       NotifyOfPropertyChange(() => Child); 
      } 
    } 

    public ShellViewModel() 
    { 
     this.Child = new MainViewModel(); 
    } 

    public void ShowOtherView() 
    { 
      this.Child = new FooViewModel(); 
    } 
} 

Vì vậy, đây là một ví dụ rất cơ bản. Nhưng như bạn thấy, ShellView của bạn cung cấp ContentControl, hiển thị chế độ xem con. Điều này ContentControl bị ràng buộc qua View.Model đến thuộc tính Child từ ShellViewModel của bạn.

Trong ShellView, tôi đã sử dụng một nút để hiển thị một chế độ xem khác, nhưng bạn cũng có thể sử dụng menu hoặc thứ gì đó tương tự.

+0

Bạn nên rõ ràng khai báo cá thể 'Con' của bạn thành loại cơ bản 'ViewModel', như 'PropertyChangedBase' hoặc 'Screen' ... – EluciusFTW

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