动态 ViewModel 导航
Dynamic ViewModel navigation
我正在尝试找到一种方法来设置从 View 到我必须导航的 ViewModel。这是为了能够在不更改核心项目的情况下更改导航流程。
我认为更简单的方法是创建一个界面,在那里设置目标 ViewModel,然后将界面注入 ViewModel 以执行导航。
public interface IModelMapping
{
MvxViewModel ViewModelToNavigate();
}
public class MyViewModel : MvxViewModel
{
readonly IMvxNavigationService navigationService;
readonly IModelMapping modelMapping;
public MyViewModel(IMvxNavigationService navigationService, IModelMapping modelMapping)
{
this.navigationService = navigationService;
this.modelMapping = modelMapping;
}
public IMvxAsyncCommand GoContent
{
get
{
IMvxViewModel vm = modelMapping.ViewModelToNavigate();
IMvxAsyncCommand navigateCommand = new MvxAsyncCommand(() => navigationService.Navigate<vm>());
return navigteCommand;
}
}
}
此代码的问题是我在设置 navigationService.Navigate() 时遇到错误。错误是 'vm is a variable but it is used like a type'
URI 导航和门面一起使用怎么样?另见 https://www.mvvmcross.com/documentation/fundamentals/navigation#uri-navigation
假设您正在构建一个任务应用程序,并且根据您想要显示不同视图的任务类型。这就是 NavigationFacades
派上用场的地方(正则表达式只能为您做这么多)。
mvx://task/?id=00 <– this task is done, show read-only view (ViewModelA)
mvx://task/?id=01 <– this task isn’t, go straight to edit view (ViewModelB)
[assembly: MvxRouting(typeof(SimpleNavigationFacade), @"mvx://task/\?id=(?<id>[A-Z0-9]{32})$")]
namespace *.NavigationFacades
{
public class SimpleNavigationFacade
: IMvxNavigationFacade
{
public Task<MvxViewModelRequest> BuildViewModelRequest(string url,
IDictionary<string, string> currentParameters, MvxRequestedBy requestedBy)
{
// you can load data from a database etc.
// try not to do a lot of work here, as the user is waiting for the UI to do something ;)
var viewModelType = currentParameters["id"] == Guid.Empty.ToString("N") ? typeof(ViewModelA) : typeof(ViewModelB);
return Task.FromResult(new MvxViewModelRequest(viewModelType, new MvxBundle(), null, requestedBy));
}
}
}
我正在尝试找到一种方法来设置从 View 到我必须导航的 ViewModel。这是为了能够在不更改核心项目的情况下更改导航流程。
我认为更简单的方法是创建一个界面,在那里设置目标 ViewModel,然后将界面注入 ViewModel 以执行导航。
public interface IModelMapping
{
MvxViewModel ViewModelToNavigate();
}
public class MyViewModel : MvxViewModel
{
readonly IMvxNavigationService navigationService;
readonly IModelMapping modelMapping;
public MyViewModel(IMvxNavigationService navigationService, IModelMapping modelMapping)
{
this.navigationService = navigationService;
this.modelMapping = modelMapping;
}
public IMvxAsyncCommand GoContent
{
get
{
IMvxViewModel vm = modelMapping.ViewModelToNavigate();
IMvxAsyncCommand navigateCommand = new MvxAsyncCommand(() => navigationService.Navigate<vm>());
return navigteCommand;
}
}
}
此代码的问题是我在设置 navigationService.Navigate() 时遇到错误。错误是 'vm is a variable but it is used like a type'
URI 导航和门面一起使用怎么样?另见 https://www.mvvmcross.com/documentation/fundamentals/navigation#uri-navigation
假设您正在构建一个任务应用程序,并且根据您想要显示不同视图的任务类型。这就是 NavigationFacades
派上用场的地方(正则表达式只能为您做这么多)。
mvx://task/?id=00 <– this task is done, show read-only view (ViewModelA)
mvx://task/?id=01 <– this task isn’t, go straight to edit view (ViewModelB)
[assembly: MvxRouting(typeof(SimpleNavigationFacade), @"mvx://task/\?id=(?<id>[A-Z0-9]{32})$")]
namespace *.NavigationFacades
{
public class SimpleNavigationFacade
: IMvxNavigationFacade
{
public Task<MvxViewModelRequest> BuildViewModelRequest(string url,
IDictionary<string, string> currentParameters, MvxRequestedBy requestedBy)
{
// you can load data from a database etc.
// try not to do a lot of work here, as the user is waiting for the UI to do something ;)
var viewModelType = currentParameters["id"] == Guid.Empty.ToString("N") ? typeof(ViewModelA) : typeof(ViewModelB);
return Task.FromResult(new MvxViewModelRequest(viewModelType, new MvxBundle(), null, requestedBy));
}
}
}