#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