Не работает Caliburn Micro для Windows Phone 8

#windows-phone-8 #caliburn.micro

#windows-phone-8 #caliburn.micro

Вопрос:

Я пытаюсь изучить Caliburn micro для использования в разработке приложений для Windows Phone 8. Но я сталкиваюсь с проблемой, поскольку он работает только для модели основного вида и не может подключить к своему виду какую-либо другую модель представления. Вот код для другой страницы, кроме главной страницы. Пожалуйста, предложите решение этой проблемы. Заранее спасибо

Страница 1.xaml

 <phone:PhoneApplicationPage
    x:Class="CalibMicro.Page1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    mc:Ignorable="d"
    shell:SystemTray.IsVisible="True">

    <!--LayoutRoot is the root grid where all page content is placed-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <!--TitlePanel contains the name of the application and page title-->
        <StackPanel Grid.Row="0" Margin="12,17,0,28">
            <TextBlock Text="MY APPLICATION" Style="{StaticResource PhoneTextNormalStyle}"/>
            <TextBlock Text="page name" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
        </StackPanel>

        <!--ContentPanel - place additional content here-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <TextBlock x:Name="TextBox2" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="50" />
        </Grid>
    </Grid>

</phone:PhoneApplicationPage>
  

Page1ViewModel

 using System.Windows;
namespace CalibMicro {
    public class Page1ViewModel : Caliburn.Micro.PropertyChangedBase 
    {
        public Page1ViewModel()
        {
            MessageBox.Show("Hello World !");
            TextBox2 = "Hello World";
        }

        private string _textBox2;
        public string TextBox2
        {
            get { return _textBox2; }
            set
            {
                _textBox2 = value;
                NotifyOfPropertyChange(() => TextBox2);
            }
        }
    }
}
  

AppBootStrapper

 namespace CalibMicro {
    using System;
    using System.Collections.Generic;
    using System.Windows.Controls;
    using Microsoft.Phone.Controls;
    using Caliburn.Micro;

    public class AppBootstrapper : PhoneBootstrapperBase {
        PhoneContainer container;

        public AppBootstrapper() {
            Initialize();
        }

        protected override void Configure() {
            container = new PhoneContainer();
            if (!Execute.InDesignMode)
                container.RegisterPhoneServices(RootFrame);

            container.PerRequest<MainPageViewModel>();
            container.PerRequest<Page1ViewModel>();

            AddCustomConventions();
        }

        protected override object GetInstance(Type service, string key) {
            var instance = container.GetInstance(service, key);
            if (instance != null)
                return instance;

            throw new InvalidOperationException("Could not locate any instances.");
        }

        protected override IEnumerable<object> GetAllInstances(Type service) {
            return container.GetAllInstances(service);
        }

        protected override void BuildUp(object instance) {
            container.BuildUp(instance);
        }

        static void AddCustomConventions() {
            ConventionManager.AddElementConvention<Pivot>(Pivot.ItemsSourceProperty, "SelectedItem", "SelectionChanged").ApplyBinding =
                (viewModelType, path, property, element, convention) => {
                    if (ConventionManager
                        .GetElementConvention(typeof(ItemsControl))
                        .ApplyBinding(viewModelType, path, property, element, convention)) {
                        ConventionManager
                            .ConfigureSelectedItem(element, Pivot.SelectedItemProperty, viewModelType, path);
                        ConventionManager
                            .ApplyHeaderTemplate(element, Pivot.HeaderTemplateProperty, null, viewModelType);
                        return true;
                    }

                    return false;
                };

            ConventionManager.AddElementConvention<Panorama>(Panorama.ItemsSourceProperty, "SelectedItem", "SelectionChanged").ApplyBinding =
                (viewModelType, path, property, element, convention) => {
                    if (ConventionManager
                        .GetElementConvention(typeof(ItemsControl))
                        .ApplyBinding(viewModelType, path, property, element, convention)) {
                        ConventionManager
                            .ConfigureSelectedItem(element, Panorama.SelectedItemProperty, viewModelType, path);
                        ConventionManager
                            .ApplyHeaderTemplate(element, Panorama.HeaderTemplateProperty, null, viewModelType);
                        return true;
                    }

                    return false;
                };
        }
    }
}
  

Ответ №1:

CalibMicro.Page1 должен быть CalibMicro.Page1View, поскольку ваша viewmodel называется Page1ViewModel

Ответ №2:

Попробуйте наследовать Screen вместо PropertyChangedBase

 Page1ViewModel:Screen
  

Комментарии:

1. Что вы подразумеваете под «не может подключить любую другую модель представления к своему представлению»?

2. @Radenko.. Когда я запускаю приложение, загружается страница 1.xaml, но окно сообщения и текстовое поле, которые есть в page1viewmodel, отсутствуют, т.е. view работает, а viewmodel — нет.

3. Насколько я понимаю, вы переходите от MainViewModel к Page1ViewModel, а конструктор Page1ViewModel не запускается? Можете ли вы также предоставить нам код для перехода к Page1ViewModel?

4. Я перевел начальную страницу навигации на страницу 1 в AppManifest