AutoWirePartialView с призмой не работает или плохо используется? - PullRequest
0 голосов
/ 22 декабря 2018

Я пытаюсь использовать призму 7.1 AutoWirePartialView для привязки PartialView к своей модели представления.Однако привязка не работает, или, по крайней мере, установка viewModel на PartialView, похоже, не работает, она все еще имеет BindingContext страницы как BindingContext.

Моя страница :

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"          
             x:Class="Project.Core.Views.NotConnectedViews.ForecastDemoPage"
             xmlns:carouselForecast="clr-namespace:Project.Core.Views.MainViews"
             xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
             x:Name="ForecastDemo"
             BackgroundColor="{StaticResource PrimaryColorOne}" ControlTemplate="{StaticResource MainAppTemplate}">

    <ContentPage.ToolbarItems>
        <ToolbarItem Name="SearchForecast" Command="{Binding ShowSearchForecastDemoCommand}" Order="Primary" Icon="ic_search_white_24dp.png" Priority="0" />
    </ContentPage.ToolbarItems>

    <ContentView x:Name="ContentViewForecast"  ControlTemplate="{StaticResource ForecastTownControlTemplate}">
        <carouselForecast:ForecastPartialViewCarousel prism:ViewModelLocator.AutowirePartialView="{x:Reference ForecastDemo}"></carouselForecast:ForecastPartialViewCarousel>
    </ContentView>

</ContentPage>

Связывание: свойство 'DayWeatherForecasts' не найдено в 'Project.Core.ViewModels.ForecastDemoPageViewModel', целевое свойство: 'Project.Core.Views.MainViews.ForecastPartialViewCarousel.ItemsSource'

Как видите, я использую частичное представление в качестве ContentPresenter для ContentView, в котором используется ControlTemplate.

Есть мой PartialView:

<carousel:CarouselViewControl x:Name="carouselView" 
                              Position="{Binding CarouselPosition}" 
                              PositionSelectedCommand="{Binding PositionChanged}" 
                              Orientation="Horizontal" AnimateTransition="True" IsSwipeEnabled="False" 
                              ItemsSource="{Binding DayWeatherForecasts}" InterPageSpacing="10"
                              xmlns="http://xamarin.com/schemas/2014/forms" 
                              xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                              xmlns:carousel="clr-namespace:CarouselView.FormsPlugin.Abstractions;assembly=CarouselView.FormsPlugin.Abstractions"
                              x:Class="Project.Core.Views.MainViews.ForecastPartialViewCarousel">
    <!-- Item template is defined here, removed for readability -->
</carousel:CarouselViewControl>

И это мой PartialView ViewModel :

namespace Project.Core.ViewModels
{
    public class ForecastPartialViewCarouselViewModel : ViewModelBase
    {

        public ForecastPartialViewCarouselViewModel(IForecastService forecastService,
            INavigationService navigationService) : base(navigationService)
        {
            InitStubForecasts();
        }


        private ObservableCollection<DayWeatherForecast> _dayWeatherForecasts;

        public ObservableCollection<DayWeatherForecast> DayWeatherForecasts
        {
            get => _dayWeatherForecasts;
            set => SetProperty(ref _dayWeatherForecasts, value);
        }
    }
}

Конечно, DayWeatherForecasts устанавливается с некоторыми значениями заглушки.Я упростил viewModel для удобства чтения.

Я не использую призму AutoWiring viewModel, поэтому в app.xaml.cs:

containerRegistry.RegisterForNavigation<ForecastDemoPage, ForecastDemoPageViewModel>();

Вопрос. Может ли быть, что мой PartialViewModel находится в папке ViewModels и чтоЧастичное представление Я хочу быть привязанным к этой ViewModel, находится в подпапке MainViews?Должен ли я создать папку MainViewsViewModel и поместить туда свою модель представления?

РЕДАКТИРОВАТЬ: Я пробовал это решение, но, как я ожидал, оно ничего не делает.

Если нет, то я не знаю, почему это не работает ...

Спасибо!

1 Ответ

0 голосов
/ 23 января 2019

Хорошо, так что я наконец-то обнаружил, что недостаточно , чтобы поместить это в мои PartialView

prism:ViewModelLocator.AutowirePartialView="{x:Reference ForecastDemo}

Когда я организовал свои представления в подпапках, призма не может зарегистрировать только мою ViewModel и мой PartialView.

Так что мне нужно было вручную зарегистрировать ViewModel на PartialView, используя ViewModelLocationProvider

protected override void RegisterTypes(IContainerRegistry containerRegistry) 
{ 
   ViewModelLocationProvider.Register<ForecastPartialViewCarousel,
   ForecastPartialViewCarouselViewModel>(); 
}

Это не только вопросимя, но пространства имен тоже.Если бы я хотел, чтобы PartialView имел правильный ViewModel набор без регистрации вручную, я должен был бы поместить свой PartialView в корневую папку Views и соответствующий ViewModel в ViewModels корневая папка (с соглашением об именах)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...