Caliburn.Новое окно Micro не соответствует соглашениям

#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 наследуете? =o

3. @ZoolWay: потому что ShellViewModel вызывается непосредственно загрузчиком и обрабатывает любую виртуальную машину, которую он открывает, как если бы она была проводником. Пожалуйста, обратитесь к caliburnmicro.com/documentation/composition для описания этого поведения.