C# Splat.Locator一个ViewModel的多个视图

C# Splat.Locator一个ViewModel的多个视图,c#,uwp,reactiveui,C#,Uwp,Reactiveui,我使用以下代码 Splat.Locator.Current.GetService(...) 获取视图模型的视图。但是这种方法只允许对一个视图模型使用一个视图。但我必须在多个视图中显示1个数据(视图模型)。通过Splat.Locator可以吗?我认为这是不可能的,因为当您首先使用ViewModel导航时,定位器会感到困惑,所以它将始终实例化与ViewModel关联的最新视图。我的建议是,您可以将该ViewModel创建为基类,然后创建另一个ViewModel,该ViewModel继承该Vie

我使用以下代码

 Splat.Locator.Current.GetService(...) 

获取视图模型的视图。但是这种方法只允许对一个视图模型使用一个视图。但我必须在多个视图中显示1个数据(视图模型)。通过Splat.Locator可以吗?

我认为这是不可能的,因为当您首先使用ViewModel导航时,定位器会感到困惑,所以它将始终实例化与ViewModel关联的最新视图。我的建议是,您可以将该ViewModel创建为基类,然后创建另一个ViewModel,该ViewModel继承该ViewModel,然后在Splat中分配它。定位器与往常一样,Register()和GetService()都有一个协定参数,您可以将其用作获取所需实现的密钥

例如,“giveMeBar”/“giveMeBaz”是合同参数的值:

使用系统;
使用Splat;
名称空间控制台EAPP1
{
内部课程计划
{
私有静态void Main()
{
//登记册
Locator.CurrentMutable.Register(()=>newbar(),typeof(IFoo),“giveMeBar”);
Locator.CurrentMutable.Register(()=>newbaz(),typeof(IFoo),“giveMeBaz”);
//决心
var bar=Locator.Current.GetService(“giveMeBar”);
var baz=Locator.Current.GetService(“giveMeBaz”);
//我们得到了什么类型的?
控制台写入线(bar);
控制台写入线(baz);
Console.ReadLine();
//产出:
//控制台P1.Bar
//ConsoleApp1.Baz
}        
}
内部接口IFoo{}
内部类栏:IFoo{}
内部类Baz:IFoo{}
}

视图模型定位器还可以使用一些属性来指定用于解析的视图约定。整洁的不过,我还没有看到使用该属性的示例。Kent Boogart举了一个在ViewModel中使用契约的示例。ViewMode选择要使用的视图。OK。非常感谢。我之前看到过这个属性,但不知道它如何帮助我:在我的应用程序中,调用Router.Navigate或ViewModelViewHost时,ReactiveUI程序集从ViewLocator.ResolveView(T viewModel,string contract=null)调用Splat.Locator.Current.GetService(…)。参数“contract”始终为null或“scape”。但是现在我找到了属性ViewModelViewHost.ViewContract、ViewModelViewHost.ViewContractObservable和RoutedViewHost.ViewContractObservable,现在我可以为不同的ViewModelViewHost和RoutedViewHost指定契约。请将其中一个答案标记为已接受,而不是将标题更改为“已解决”;然后我们就知道你找到了解决问题的办法。