【问题标题】:AutoWirePartialView with prism does not work or badly used?带棱镜的 AutoWirePartialView 不起作用或使用不当?
【发布时间】:2019-05-22 14:17:46
【问题描述】:

我正在尝试使用 prism 7.1 AutoWirePartialViewPartialView 绑定到它的 viewModel。但是,绑定不起作用,或者至少将 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,用于使用ControlTemplateContentView

有我的 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。

我没有使用 prism AutoWiring viewModel,所以在 app.xaml.cs 中:

containerRegistry.RegisterForNavigation<ForecastDemoPage, ForecastDemoPageViewModel>();

问题:难道我的PartialViewModel 位于 ViewModels 文件夹中,而我想绑定到此 ViewModel 的 Partialview 位于子文件夹 MainViews 下?我应该创建一个MainViewsViewModel 文件夹并将我的viewModel 放在那里吗?

编辑:我尝试了这个解决方案,但正如我所料,它什么也没做。

如果不行,那我也不知道为什么不行……

谢谢!

【问题讨论】:

    标签: xamarin.forms prism partial-views autowired


    【解决方案1】:

    好的,所以我终于发现它不够把这个放到我的PartialView

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

    当我在子文件夹中组织视图时,prism 无法单独注册我的ViewModel 和我的PartialView

    所以我需要使用ViewModelLocationProvider手动注册ViewModelPartialView

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

    这不仅仅是名称的问题,还有命名空间的问题。如果我希望 PartialView 设置正确的 ViewModel 而无需手动注册,我应该将我的 PartialView 放在 Views 根文件夹中,并将相应的 ViewModel 放在ViewModels 根文件夹(有命名约定)

    【讨论】:

    • 您的解决方案对我有用,但后面代码中的 BindingContext 属性为空。你知道为什么吗?如何获得局部视图视图模型?
    • @jcasas 您何时何地尝试在代码隐藏中获取视图的视图模型?我认为您最好的选择是在您的视图的 OnBindingContextChanged 方法中获取它。正如您所注意到的,它在视图的构造函数中可能为 null,因为我们真的不知道 prism 何时会设置它。
    • 成功了!谢谢!如果视图模型已经设置。
    • 很高兴它有帮助!
    • 嗨@Umar3x - 你关于 ViewModelLocationProvider 的观点帮助我设置了绑定上下文。但是,我的命令不起作用。你能让命令工作吗?
    猜你喜欢
    • 2013-02-12
    • 2018-02-20
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 2022-07-13
    相关资源
    最近更新 更多