Tôi vừa mới bắt đầu phát triển cửa sổ mới của mình 8 ứng dụng tuần trước bằng cách sử dụng ánh sáng mvvm. Tôi quen với điều hướng mvvmlight WP7. Làm thế nào tôi có thể đạt được như nhau trong windows 8. Có thể bất kỳ một đề nghị một phương pháp tốt hơn để đạt được như nhau trong windows 8. Tôi tìm thấy một giải pháp, nơi chúng tôi ghi đè lên các sự kiện onnavigated trong vm và xử lý điều hướng đến trang khác. Nhưng tôi nghĩ rằng phương pháp đó đã lỗi thời. Bất kỳ ai xin vui lòng hướng dẫn tôi với việc thực hiện đúng. Cảm ơn trước.Điều hướng trang thông qua ViewModel sử dụng MVVMLight trong windows 8
Trả lời
Tôi hiểu đây không phải là câu trả lời chính xác mà bạn có thể đang tìm kiếm, nhưng điều này có thể cung cấp cho bạn một số ý tưởng để khám phá.
Trong trường hợp của tôi, tôi không sử dụng MVVMLight - nhưng thực thi MVVM đơn giản của riêng tôi. Tôi sử dụng lớp BindableBase
(đi kèm với mẫu RC 2012 RC mặc định) cho thông báo thuộc tính. Tôi tưởng tượng, bạn có thể sử dụng MVVMLight để cung cấp cho bạn một số cơ sở hạ tầng, mà bạn có thể bổ sung với một cái gì đó như dưới đây.
Đối với chuyển hướng, tôi xác định một giao diện trông giống như:
Và thực hiện nó như sau:
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Windows.UI.Xaml.Controls;
public class NavigationService : INavigationService
{
private readonly Frame _frame;
public NavigationService(Frame frame)
{
_frame = frame;
_frame.Navigated += OnFrameNavigated;
}
private void OnFrameNavigated(object sender, Windows.UI.Xaml.Navigation.NavigationEventArgs e)
{
var view = e.Content as IView;
if (view == null)
return;
var navMsg = new NavigationMessage()
{
Sender = this,
NewView = view,
Parameter = e.Parameter,
NavigationMode = (int)e.NavigationMode
};
EventManager.Current.Publish(navMsg);
//Anything that the parent needs to be notified should happen in of after this method
var viewModel = view.ViewModel;
if (viewModel != null)
viewModel.Initialise(e.Parameter);
}
public void Navigate(Type pageType)
{
DisposePreviousView();
_frame.Navigate(pageType);
}
public void Navigate(Type pageType, object parameter)
{
DisposePreviousView();
_frame.Navigate(pageType, parameter);
}
private void DisposePreviousView()
{
var currentView = this.CurrentView;
var currentViewDisposable = currentView as IDisposable;
if (currentViewDisposable != null)
{
currentViewDisposable.Dispose();
currentViewDisposable = null;
} //view model is disposed in the view implementation
}
public void EnsureNavigated(Type pageType, object parameter)
{
var currentView = this.CurrentView;
if (currentView == null || currentView.GetType() != pageType)
{
Navigate(pageType, parameter);
}
}
public IView CurrentView
{
get { return _frame.Content as IView; }
}
public bool CanGoBack
{
get { return _frame != null && _frame.CanGoBack; }
}
public void GoBack()
{
// Use the navigation frame to return to the previous page
if (_frame != null && _frame.CanGoBack) _frame.GoBack();
}
public bool CanGoForward
{
get { return _frame != null && _frame.CanGoForward; }
}
public void GoForward()
{
// Use the navigation frame to return to the previous page
if (_frame != null && _frame.CanGoForward) _frame.GoForward();
}
}
IView:
public interface IView : IDisposable
{
IViewModel ViewModel { get; }
void Refresh();
}
IViewModel:
public interface IViewModel : INotifyPropertyChanged, IDisposable
{
void Initialise(object parameter);
string ViewTitle { get; }
void Refresh();
}
Cuối cùng, trong trang XAML, xác định một yếu tố Frame
:
<Frame x:Name="ContentFrame" />
Và trong code-behind of the page: (điều này ở phần xấu xí chỉ trong quan điểm của tôi - nhưng nó hy vọng không phải là quá xấu):
var _navigationService = new NavigationService(this.ContentFrame);
Bây giờ bạn có thể chuyển _navigationService
sang chế độ xem. Trong trường hợp của tôi, tôi tạo chế độ xem trong mã phía sau của trang:
public HomePage()
{
this.InitializeComponent();
var _navigationService = NavigationService.GetFor(this.ContentFrame);
DataContext = new HomePageViewModel(_navigationService);
}
Hy vọng điều này sẽ hữu ích.
+1 - Tôi thích cách tiếp cận này. Đối với "phần xấu xí", bạn có thể sử dụng vùng chứa DI để bạn không phải chuyển dịch vụ tới viewmodel trong codebehind của khung nhìn. – EkoostikMartin
Phiên bản mới nhất của MVVMLight có một SimpleIoc mà đặt này trong vở kịch ra khỏi hộp với một vài dòng mã. –
NavigationService nằm trong MVVMLight đã được di chuyển trong gói mới có tên WinRTBehaviors. Bạn cũng có thể nhận EventToCommand trong Win8nl, cả từ nuget. Xem blog của tôi được đăng ở đây:
Bắt đầu w/MVVM Light for Windows 8, EventToCommand và Hành vi http://blog.tattoocoder.com/2012/08/getting-started-w-windows-8-mvvm-light.html
Đọc bài báo đăng trên Tạp chí MSDN chỉ thời gian gần đây bởi Laurent Bugnion mình vào làm việc với Toolkit MVVM Light và Windows 8.
Hướng tới cuối bài viết, ông giải thích chính xác cách thiết lập số NavigationService
mà bạn cần.
- 1. Windows Phone 8: Cách tạo điều hướng trang động?
- 2. MessengerInstance vs Messenger.Default trong Mvvmlight
- 3. Sử dụng phương pháp App.Current.Terminate() trong Windows phone 8
- 4. Sử dụng SQLite3 trong Windows 8 Ứng dụng Javascript
- 5. Sử dụng phông chữ tùy chỉnh trong Windows Phone 8
- 6. MVVMLight - cách nhận tham chiếu đến ViewModel trong Chế độ xem?
- 7. Trang chuyển hướng sau khi thay đổi UriMapper trong Windows Phone 8
- 8. Thông tin mạng Windows Phone 8
- 9. UTF-8 trong Windows
- 10. Sử dụng jQuery để điều hướng khỏi trang
- 11. DwmIsCompositionEnabled có còn được sử dụng trong Windows 8 không?
- 12. {get; bộ; } được sử dụng trong ViewModel
- 13. Ngăn trang web điều hướng khỏi sử dụng JavaScript
- 14. Windows 8 & Windows Phone 8
- 15. MVVMLight ViewModelLocator đăng ký DataService
- 16. Nếu NETFX_CORE dành cho Windows 8, điều gì là dành cho Windows Phone 8?
- 17. Sử dụng IMultiValueConverter để vượt qua nhiều CommandParameters để ViewModel
- 18. Có phải MVVM đã chết trong Windows 8 Store Apps?
- 19. Phản ánh trong ứng dụng Windows 8
- 20. Có cách nào để gọi Điều hướng từ bên trong ViewModel không?
- 21. WinRT - Cách bỏ qua hoặc xóa trang khỏi lịch sử điều hướng
- 22. Các ứng dụng Windows Azure và Metro trong Windows 8
- 23. Windows Phone 8 - MVVM ViewModels và App.xaml.cs
- 24. Windows 8 VS2012 IISExpress Windows Authentication
- 25. Cạo một trang web và điều hướng bằng nút nhấn
- 26. Gọi bộ điều khiển xem phụ huynh (thông qua bộ điều hướng)
- 27. Mọi người đang sử dụng gì thay vì IMultiValueConverters trong Windows 8?
- 28. Âm thanh nền trong Windows 8 App
- 29. Xem qua MVC JSON ViewModel để xem
- 30. Cách cắt video mp4 trong Ứng dụng Windows Phone 8
bạn có thể chia sẻ giải pháp của mình, cách bạn ghi đè OnNavigatedTo trong vm? –