可以改进此通用导航命令吗?

时间:2019-07-09 11:54:37

标签: c# xaml xamarin.forms

我一直在寻找一种创建导航的方法,该方法是将命令绑定与视图中指定的命令参数结合使用,以在ViewModel中执行“通用”导航命令。

这是enterprise application example中的自定义导航服务中的原始导航实现。

        public Task NavigateToAsync<TViewModel>() where TViewModel : ViewModelBase
        {
            return InternalNavigateToAsync(typeof(TViewModel), null);
        }

您可以通过以下方式来驱动:

NavigateToAsync<SomeViewModel>();

我能想出的最好的办法是用上面的实现替换:

        public Task NavigateToAsync(Type viewModel)
        {
            return InternalNavigateToAsync(viewModel, null);
        }

在ViewModel类型作为命令参数从命令视图传递的地方。

我正在寻找的是找出是否有可能将这两者结合起来,而不必依赖于单独的实现。

我想保留这个,

NavigateToAsync<TViewModel>();

但是有一些方法可以从视图的命令参数中调用和推断。

听起来完全合理吗?

很抱歉,由于我正处于当前能力的边缘,无法更加连贯地表达我的问题。

如果我确切地知道我要描述的是什么,我知道我可以将问题压缩成几句话。

在我的进度变得陈旧的过程中,我希望能找到任何指向此资源的线索。

干杯。

编辑: 感谢G.hakim的提问。

使用这些:

            <Button
                Command="{Binding NavigationCommand}"
                CommandParameter="{x:Type vm:SomeViewModel}" />
public ICommand NavigationCommand
 => new Command<Type>(async (Type viewModelType)
 => await Navigate(viewModelType));

我可以使用一个命令导航到许多不同的视图, 因此,我认为我能够不必编写多个导航命令。

1 个答案:

答案 0 :(得分:0)

您可以做的是这样的:

 public Task NavigateToAsync<T>() 
    {
        return InternalNavigateToAsync(typeof(T), null);
    }

现在,该泛型将接受您在T中按下的任何内容

有关泛型工作原理的更多信息,请检查Microsoft文档是否相同。

此外,您可以通过向其添加where子句来确切指定泛型应为哪种类型,以免遇到任何类型的运行时错误。

 public Task NavigateToAsync<T>() where T : YourViewModelType
    {
        return InternalNavigateToAsync(typeof(T), null);
    }