Mvvm UWP中带子目录的Prism自动ViewModelLocator
我不知道这是否是一个好的实践,但我想使用“视图”和“视图模型”目录中的子目录 我现在有这个密码Mvvm UWP中带子目录的Prism自动ViewModelLocator,mvvm,uwp,prism,windows-10-universal,prism-6,Mvvm,Uwp,Prism,Windows 10 Universal,Prism 6,我不知道这是否是一个好的实践,但我想使用“视图”和“视图模型”目录中的子目录 我现在有这个密码 namespace Project.Universal.ViewModels.Sales { public class SalesListViewModel:ViewModelBase { // Properties private string _test; private ICollection<Sale> _sales;
namespace Project.Universal.ViewModels.Sales
{
public class SalesListViewModel:ViewModelBase
{
// Properties
private string _test;
private ICollection<Sale> _sales;
public string Test
{
get => _test;
set => SetProperty(ref _test, value);
}
public ICollection<Sale> Sales {
get => _sales;
private set
{
}
}
// Services
private readonly IStandardService<Sale> _salesService;
// Commands
public DelegateCommand Update { get;}
// Constructor
public SalesListViewModel(IStandardService<Sale> salesService)
{
Debug.WriteLine(">>>> Initializing SalesListViewModel, trying to set _salesService.");
_salesService = salesService;
Debug.WriteLine(">>>> Delegating command to update SalesListViewModel.");
Update = new DelegateCommand(async () =>
{
Sales = await _salesService.GetAsync();
Test = "Test";
});
}
}
}
我使用的模板来自Windows template Studio和Prism 6.3框架。
对不起,我的英语不好。下班后,我已经解决了我的问题: Windows Template Studio已将
ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver()
方法更改为保持与其他框架的兼容性。我刚刚改变了这个方法,就像我想要的那样,这很有效。对于其他有同样问题的人,这里是代码
ClassApp.xaml.cs
protected override async Task OnInitializeAsync(IActivatedEventArgs args)
{
await ThemeSelectorService.InitializeAsync().ConfigureAwait(false);
ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver((viewType) =>
{
var viewName = viewType.FullName; // get full type name
var viewModelName = viewName
.Substring(0, viewName.Length - 4)
.Replace(".Views.", ".ViewModels.");
var viewModelAssembly = viewType.GetTypeInfo().Assembly.FullName;
//var viewModel
var viewModelTypeName = string.Format(CultureInfo.InvariantCulture, "{0}ViewModel, Project.Universal", viewModelName);
return Type.GetType(viewModelTypeName);
});
await base.OnInitializeAsync(args);
}
嗨,我想目录不是问题,但是你的名称空间…你能尝试使用…视图模型和…视图吗?否则,您需要修改扫描类的方式。但是我不知道怎么做…哦,是的,我改变了我扫视班级的方式。我会发布我的解决方案,谢谢。
Views/Context/ViewPage.xaml for views
ViewModels/Context/ViewModel.cs for viewModels
protected override async Task OnInitializeAsync(IActivatedEventArgs args)
{
await ThemeSelectorService.InitializeAsync().ConfigureAwait(false);
ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver((viewType) =>
{
var viewName = viewType.FullName; // get full type name
var viewModelName = viewName
.Substring(0, viewName.Length - 4)
.Replace(".Views.", ".ViewModels.");
var viewModelAssembly = viewType.GetTypeInfo().Assembly.FullName;
//var viewModel
var viewModelTypeName = string.Format(CultureInfo.InvariantCulture, "{0}ViewModel, Project.Universal", viewModelName);
return Type.GetType(viewModelTypeName);
});
await base.OnInitializeAsync(args);
}