【问题标题】:Prism Auto ViewModelLocator with Subdirectories in UWPPrism Auto ViewModelLocator 与 UWP 中的子目录
【发布时间】:2018-10-29 02:47:09
【问题描述】:

我不知道这是否是一个好习惯,但我想在“Views”和“ViewModels”目录中使用子目录

我现在有这个代码

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";
            });
        }

    }
}

这是我的查看页面

<mvvm:SessionStateAwarePage
    x:Class="Project.Universal.Views.Sales.SalesListPage"
    mvvm:ViewModelLocator.AutoWireViewModel="True"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Project.Universal.Views.Sales"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    xmlns:mvvm="using:Prism.Windows.Mvvm"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

    <Grid Margin="{StaticResource MediumLeftTopRightBottomMargin}">
        <TextBlock>this is the Sales page</TextBlock>
        <TextBlock Text="{Binding Test}"></TextBlock>
    </Grid>
</mvvm:SessionStateAwarePage>

但是 Prism 没有正确注入视图模型。取消这一点,Prism 框架正在注入 ShellViewModel,如下面的错误所示:

错误:BindingExpression 路径错误:在“Project.Universal.ViewModels.ShellViewModel”上找不到“Test”属性。 BindingExpression: Path='Test' DataItem='Project.Universal.ViewModels.ShellViewModel';目标元素是'Windows.UI.Xaml.Controls.TextBlock'(名称='null');目标属性是“文本”(类型“字符串”)

对于组织,我想将此模式用于文件夹:

Views/Context/ViewPage.xaml for views
ViewModels/Context/ViewModel.cs for viewModels

我正在使用带有 Prism 6.3 框架的 Windows Template Studio 中的模板。 对不起我的英语。

【问题讨论】:

  • 嗨,我猜目录不是问题,但是您的命名空间...您可以尝试使用...ViewModels 和...Views 吗?否则您需要修改扫描类的方式。但我不知道该怎么做......
  • 哦,是的,我改变了扫描课程的方式。我会发布我的解决方案,谢谢。

标签: mvvm uwp prism windows-10-universal prism-6


【解决方案1】:

几个小时后我解决了我的问题:

Windows 模板工作室已更改 ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver() 方法以保持与其他框架的兼容性。我刚刚改变了我想要的这种方法并且有效。对于其他会遇到同样问题的人,这里是代码。

班级App.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);
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多