Model Tampilan Prisma UWP Adalah Null

Menggunakan Templat Windows Universal Visual Studio 2017 Saya membuat aplikasi uji UWP menggunakan Prism. Semuanya berfungsi dengan baik sampai saya menambahkan halaman kosong baru ke aplikasi. Pemandangan tersebut disebut:

AbcPage

XAML

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

<Grid>
    <Button Click="Button_Click" Content="test" />
</Grid>

I added the

 xmlns:prismMvvm="using:Prism.Windows.Mvvm"
 prismMvvm:ViewModelLocator.AutoWireViewModel="True"

Kode di baliknya adalah:

 namespace UI_Test_1.Views
{
   public sealed partial class AbcPage : Page
   {
      AbcPageViewModel viewModel => DataContext as AbcPageViewModel;
      public AbcPage()
      {
          this.InitializeComponent();
      }
      private void Button_Click(object sender, RoutedEventArgs e)
      {
         var vm = viewModel;//this is null
       }
  }
}

Dan akhirnya ViewModel saya:

namespace UI_Test_1.ViewModels
{
   public class AbcPageViewModel : ViewModelBase
   {
       public AbcPageViewModel()
       {
       //never called
        }
    }
 }

Konvensi tersebut tampaknya benar atau apakah saya melakukan kesalahan? Mengapa

 AbcViewModel

batal? Bagaimana cara men-debug ini?


person Paul Stanley    schedule 14.11.2018    source sumber
comment
Anda perlu menambahkan AbcPageViewModel Anda di folder ViewModels, di situlah prisma akan mencoba mencari secara default.   -  person Dishant    schedule 15.11.2018
comment
AbcPageViewModel ada di folder ViewModels.   -  person Paul Stanley    schedule 15.11.2018
comment
Versi prisma manakah yang Anda gunakan?   -  person Nico Zhu - MSFT    schedule 15.11.2018
comment
Sayangnya tidak ada kode seperti itu di proyek saya. App.xaml.cs memiliki rutinitas inisialisasi dan Anda dapat mengonfigurasi container untuk Ioc tetapi tidak seperti tautannya. Terima kasih.   -  person Paul Stanley    schedule 15.11.2018
comment
Jadi, emm, masalahnya sudah terpecahkan?   -  person Nico Zhu - MSFT    schedule 15.11.2018
comment
Saya menggunakan template yang disertakan dengan Visual Studio 15.8.9 Prism Unity 7.1.0.431 menurut ti Nuget   -  person Paul Stanley    schedule 15.11.2018
comment
Mari kita melanjutkan diskusi ini dalam chat.   -  person Nico Zhu - MSFT    schedule 15.11.2018


Jawaban (2)


Untuk menggunakan rilis awal prisma dalam uwp, Anda perlu mengonfigurasi lebih banyak berdasarkan proyek uwp asli, seperti kelas App dan kelas Page. Tentu saja, pejabat tersebut telah menyediakan contoh kode yang dapat Anda gunakan merujuk.

public sealed partial class App : PrismUnityApplication
{
    public App()
    {
        InitializeComponent();
    }

    protected override UIElement CreateShell(Frame rootFrame)
    {
        var shell = Container.Resolve<AppShell>();
        shell.SetContentFrame(rootFrame);
        return shell;
    }

    protected override Task OnInitializeAsync(IActivatedEventArgs args)
    {
        Container.RegisterInstance<IResourceLoader>(new ResourceLoaderAdapter(new ResourceLoader()));
        return base.OnInitializeAsync(args);
    }

    protected override Task OnLaunchApplicationAsync(LaunchActivatedEventArgs args)
    {
        NavigationService.Navigate(PageTokens.Main.ToString(), null);
        return Task.FromResult(true);
    }
}

Untuk versi 7.2 terakhir yang tidak dirilis memiliki mode penggunaan baru. Untuk informasi lebih lanjut, silakan periksa tautan ini.

sealed partial class App : PrismApplication
{
    public static IPlatformNavigationService NavigationService { get; private set; }

    public App()
    {
        InitializeComponent();
    }

    public override void RegisterTypes(IContainerRegistry container)
    {
        container.RegisterForNavigation<MainPage, MainPageViewModel>(nameof(Views.MainPage));
    }

    public override void OnInitialized()
    {
        NavigationService = Prism.Navigation.NavigationService
            .Create(new Frame(), Gestures.Back, Gestures.Forward, Gestures.Refresh);
        NavigationService.SetAsWindowContent(Window.Current, true);
    }

    public override void OnStart(StartArgs args)
    {
        NavigationService.NavigateAsync(nameof(Views.MainPage));
    }
}
person Nico Zhu - MSFT    schedule 15.11.2018

Saya membuat kesalahan dengan konvensi penamaan. Jika halaman Anda adalah AbcPage maka model tampilannya harus AbcViewModel BUKAN AbcPageViewModel.

person Paul Stanley    schedule 15.11.2018