2012-06-18 2 views
3

У меня возникли проблемы с загрузкой представления в 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

+0

Можете ли вы поместить решение на github, и я возьму его и просмотрю. –

+0

Где вы устанавливаете '_topMenu' и' _topMenu'? Поскольку Caliburn не будет создавать ViewModels для вас. Он имеет два режима: сначала ViewModel, затем он создаст представление для viewmodel. OR Сначала вы создаете View, а также ViewModel и caliburn, просто склейте их вместе. – nemesv

+0

@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

ответ

0

Либо создать экземпляр модели просмотра в конструкторе ShellViewModel, или если вы хотите, чтобы их экземпляры на более позднем этапе, а затем добавить сеттер своих свойств вида модели, и вызови NotifyOfPropertyChange метод уведомления вашего пользовательского интерфейса о том, что эти ссылки на свойства были изменены.

Смежные вопросы