Caliburn Micro Conductor.Collection.AllActive не работает - PullRequest
0 голосов
/ 28 июня 2018

Я пытался активировать несколько окон в приложении, используя Caliburn Micro с Conductor.Collection.AllActive

Шаги:

Унаследованная MainHomeViewodel от Conductor.Collection.AllActive

1) созданное свойство

public ExploreViewModel Explorer {
   get; private set;  
 }

2) Создан ContentControl с именем в качестве имени свойства

<ContentControl x:Name="Explorer" />

3) Активированная модель представления со свойством

Explorer = new ExplorerViewModel();
ActivateItem(Explorer );

После выполнения вышеупомянутого кода он создает экземпляр ExplorerViewModel, но не переходит в конструктор View или показывает View.

Возникли проблемы с приведенной выше реализацией или мне нужно сделать что-нибудь еще для активации элемента.

Пожалуйста, помогите!

Спасибо.

EDIT

    public class MainHomeWindowViewModel : Conductor<IScreen>.Collection.AllActive
    {
      protected override void OnInitialize()
      {
       base.OnInitialize();
       ShowExplorer();
       }
        public void ShowExplorer()
        {

            Explorer = new ExplorerViewModel();
            ActivateItem(Explorer );

        }
}

1 Ответ

0 голосов
/ 28 июня 2018

Conductor.Collection.AllActive использует Items свойство. Если вы хотите отобразить несколько экранов одновременно, вы должны добавить их в свойство Items.

Тогда, поскольку ваши представления хранятся в свойстве Items, вы хотите связать свое представление с Items. Это пример:

Проводник:

public class ShellViewModel : Conductor<IScreen>.Collection.AllActive
{
    public ShellViewModel()
    {
        Items.Add(new ChildViewModel());
        Items.Add(new ChildViewModel());
        Items.Add(new ChildViewModel());
    }
}

Вид проводника (обратите внимание, потому что мы показываем коллекцию элементов, которые мы хотим использовать ItemsSource, а не ContentControl):

<Grid>
    <StackPanel>
        <ItemsControl x:Name="Items"></ItemsControl>
    </StackPanel>
</Grid>

Детский экран:

public class ChildViewModel : Screen
{
}

Детский вид:

<Grid>
    <Border Width="50" Height="50" BorderBrush="Red" BorderThickness="5"></Border>
</Grid>

РЕДАКТИРОВАТЬ: Что касается обсуждения в комментариях, вот как вы можете использовать IWindowManager, чтобы показать несколько окон:

public class ShellViewModel : Screen
{

    public ShellViewModel(IWindowManager windowManager)
    {
        var window1 = new ChildViewModel();
        var window2 = new ChildViewModel();

        windowManager.ShowWindow(window1);
        windowManager.ShowWindow(window2);

        window1.TryClose();
    }
}
...