#c# #mvvm #caliburn.micro
#c# #mvvm #caliburn.micro
Вопрос:
Мое приложение запущено и работает с CM. Представление оболочки содержит несколько ContentControls, которые сами содержат представления. Они назначаются по соглашению, поскольку они получили имя, соответствующее свойству в модели представления.
Я получил окно WPF (по крайней мере, его класс наследуется от Window
), которое открывается из моего приложения с windowManager.ShowDialog(viewModel)
помощью . Внутри этого окна снова у меня есть ContentControls, но они не привязаны к просмотру свойств модели.
Я уже пытался установить cal:View.ApplyConventions="True"
в окне, но это тоже не помогло. Я также использовал ViewModelBinder.Bind(viewmodel, view, null)
для привязки виртуальной машины и просмотра перед отображением окна — тоже не работает.
Как я могу убедиться, что в моем открытом окне (модальном диалоговом окне) используются те же улучшения CM?
Это представление:
<Window x:Class="Client.Views.History.HistoryView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:cal="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro"
Title="Historie" Height="300" Width="300"
cal:View.ApplyConventions="True"
>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="64" />
<RowDefinition Height="*" />
<RowDefinition Height="20" />
</Grid.RowDefinitions>
<ContentControl x:Name="HeaderView" Grid.Row="0" Grid.Column="0" />
<ContentControl x:Name="RecordView" Grid.Row="1" Grid.Column="0" />
<Border Grid.Row="2" Grid.Column="0" Background="DarkKhaki" BorderThickness="2" BorderBrush="DarkSeaGreen" />
</Grid>
</Window>
Отображается граница, поэтому загружается представление. DataContext должен быть установлен caliburn micro. Это модель представления:
public class HistoryViewModel : PropertyChangedBase
{
#region Fields --------------------------------------------------------
private readonly HeaderViewModel headerView;
private readonly RecordViewModel recordView;
#endregion
public HistoryViewModel()
{
this.headerView = IoC.Get<HeaderViewModel>();
this.recordView = IoC.Get<RecordViewModel>();
}
public HeaderViewModel HeaderView
{
get { return this.headerView; }
}
public RecordViewModel RecordView
{
get { return this.recordView; }
}
}
Конструктор запускается, модели представления создаются (не null). Но свойства HeaderView
и RecordView
никогда не доступны.
Чтобы запустить это, я использую этот код:
HistoryViewModel viewModel = IoC.Get<HistoryViewModel>();
windowManager.ShowDialog(viewModel);
Это работает при явной привязке модели следующим образом:
<ContentControl x:Name="HeaderView" cal:View.Model="{Binding HeaderView}" Grid.Row="0" Grid.Column="0" />
<ContentControl x:Name="RecordView" cal:View.Model="{Binding RecordView}" Grid.Row="1" Grid.Column="0" />
Но я хотел бы знать, как можно повторно включить стандартные механизмы.
Комментарии:
1. Это может помочь увидеть некоторый код.
DataContext
Правильно ли указано в самом окне и правильно ли отображается хотя бы предполагаемое представление?2. @Chris Я добавил часть кода. Да, отображается представление для окна — только содержимое для его ContentControls отсутствует.
Ответ №1:
Я думаю, что ваша HistoryViewModel должна быть проводником, чтобы заставить это работать. Поскольку вы хотите, чтобы обе дочерние виртуальные машины отображались одновременно, вы должны наследовать от Conductor .Коллекция.AllActive.
Джон
Комментарии:
1. Если это так, почему мне не нужно делать это для
ShellViewModel
(имеется в виду основной вид при запуске приложения)?2. От чего вы
ShellViewModel
наследуете? =o3. @ZoolWay: потому что ShellViewModel вызывается непосредственно загрузчиком и обрабатывает любую виртуальную машину, которую он открывает, как если бы она была проводником. Пожалуйста, обратитесь к caliburnmicro.com/documentation/composition для описания этого поведения.