У меня возникли проблемы с загрузкой представления в ContentControl. Я стараюсь, чтобы это было как можно проще, поэтому я использовал проект Hello, который поставляется с CM. Я убедился, что проект Hello компилируется правильно и работает. Он отображает окно с текстовым полем и кнопкой. И текстовое поле, и кнопка подключены во время выполнения к образцу ViewModel.Caliburn.Micro электропроводка a View to ViewModel для отображения ContentControl
Я изменил ShellView.xaml и заменил элемент управления StackPanel на Grid-управление и установил сетку с 4 строками и одним столбцом. Я назначил текстовое поле в первую строку, кнопку во вторую строку, а затем два отдельных ContentControl до последних двух строк.
<Grid Width="800" Height="600">
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<TextBox Grid.Row="0" Grid.Column="0" x:Name="Name" />
<Button Grid.Row="1" Grid.Column="0" x:Name="SayHello" Content="Click Me" />
<ContentControl Grid.Row="2" Grid.Column="0" x:Name="TopMenu"
VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch"></ContentControl>
<ContentControl Grid.Row="3" Grid.Column="0" x:Name="BottomMenu"
VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch"></ContentControl>
</Grid>
Я создал две отдельные классы C# в папке ViewModels которые являются ViewModels и называются соответственно TopMenuViewModel.cs и BottomMenuViewModel.cs. Оба класса расширяют класс PropertyChangedBase. Это просто имитирует класс ShellViewModel.cs, который поставляется с образцом проекта.
using System;
using Caliburn.Micro;
namespace TestWithCaliburnMicro.ViewModels
{
/// <summary>
/// Description of BottomMenuViewModel.
/// </summary>
public class BottomMenuViewModel : PropertyChangedBase
{
public BottomMenuViewModel()
{
}
}
Я создал два отдельных пользовательские элементы управления WPF в папке Views, которые являются соответствующим видом и, соответственно, называются TopMenuView.xaml и BottomMenuView.xaml. Я добавил ярлык в каждом xaml с содержанием «Top Menu» или «Bottom Menu», чтобы разграничить их.
<Grid>
<Label>Bottom Menu View</Label>
</Grid>
В классе ShellViewModel.cs я создал два открытых свойства с только «получить» аксессору набор вернуть экземпляр соответствующего ViewModel.
private BottomMenuViewModel _bottomMenu;
public BottomMenuViewModel BottomMenu {
get { return _bottomMenu; }
}
private TopMenuViewModel _topMenu;
public TopMenuViewModel TopMenu {
get { return _topMenu;}
}
Добавление перерыва в get accessor любого из свойств показывает, что get accessor вызывается при отладке проекта. Я добавил простой оператор конструктору класса BottomMenuViewModel.cs, например int x = 0, и добавил разрыв к этой строке, но разрыв никогда не попадает, что для меня означает, что конструктор не вызывается, так что действительно класс не создается?
Я считаю, что я делаю это исключительно основной и прочитать все О Конвенциях документа на сайте СМ Codeplex, и подтвердил логику с этим комментарием: Prior question on stackoverflow
Надеюсь кто-то будет время, чтобы прочитать это и назовите меня в правильном направлении. Благодарю.
Решение на GitHub. Примечание: сделано с SharpDevelop 4.x GitHub solution
Можете ли вы поместить решение на github, и я возьму его и просмотрю. –
Где вы устанавливаете '_topMenu' и' _topMenu'? Поскольку Caliburn не будет создавать ViewModels для вас. Он имеет два режима: сначала ViewModel, затем он создаст представление для viewmodel. OR Сначала вы создаете View, а также ViewModel и caliburn, просто склейте их вместе. – nemesv
@nemesv: Хорошая точка. Я придерживался соглашения о поставке только get accessor, основываясь на проекте HelloScreens, который находится здесь: [link] (http://caliburnmicro.codeplex.com/wikipage?title=Screens%2c%20Conductors%20and%20Composition&referringTitle=Documentation) а также HelloScreensWPF, расположенные здесь: [link] (https://skydrive.live.com/?cid=5f154148de0c0da9#), в которых показано, как использовать get accessor для показа View. 'readonly Диалоги IDialogManager; общедоступные диалоги IDialogManager { get {return dialogs; } } ' – voidmain