C# Caliburn Micro управляет окнами / видами - PullRequest
0 голосов
/ 31 марта 2020

В настоящее время я разрабатываю приложение WPF в C#. Я использую Caliburn Micro в качестве основы. MainWindow (ShellView) состоит в основном из левой и правой частей. Обе части являются TabControls. С левой стороны у меня есть 3 вкладки, а с правой стороны у меня есть 6 вкладок.

В настоящее время я создаю экземпляры 9 ViewModel из 9 представлений с помощью конструктора ShellViewModel, а затем связываю View с ContentControl to TabControl.

Обычно с Caliburn Micro, который можно лучше обрабатывать с помощью класса Conductor. Я мог бы создать список и связать этот список с TabControl, и все.

Но проблема в том, что у меня есть Items-Collection только один раз, потому что он унаследован от класса Conductor. Поэтому, если я привяжу левый TabControl к тем же элементам, что и правый TabControl, у меня будут одинаковые вкладки с обеих сторон, а это не то, что я хочу.

Есть ли способ иметь 2 независимых элемента- коллекции?

Спасибо

1 Ответ

0 голосов
/ 31 марта 2020

Вам необходимо создать отдельную модель вида для каждой стороны основного экрана. Каждая из этих моделей представления может наследоваться от класса Conductor<object>.Collection.OneActive. Ваша модель вида оболочки будет состоять из двух моделей подвидов. Ваш вид оболочки также будет состоять из двух элементов управления контентом, в которых должны отображаться каждая из моделей подвидов и подвидов.

public class ShellViewModel : Conductor<object>.Collection.AllActive {
   public LeftSideViewModel LeftSide { get; set; }
   public RightSideViewModel RightSide { get; set; }

   public ShellViewModel(LeftSideViewModel leftSide, RightSideViewModel rightSide) {
      LeftSide = leftSide;
      RightSide = rightSide;
      ActivateItem(leftSide);
      ActivateItem(rightSide);
   }
}

<UserControl x:Class="Workbench.Views.ShellView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <DockPanel LastChildFill="True">
        <ContentControl x:Name="LeftSide" DockPanel.Dock="Top"/>

        <ContentControl x:Name="RightSide"/>
    </DockPanel>
</UserControl>

public class LeftSideViewModel : Conductor<object>.Collection.OneActive {
   public LeftSideViewModel(...) {
       ActivateItem(yourTabViewModel);
       ActivateItem(anotherTabViewModel);
       ...
   }
}

public class RightSideViewModel : Conductor<object>.Collection.OneActive {
   public RightSideViewModel(...) {
       ActivateItem(yourTabViewModel);
       ActivateItem(anotherTabViewModel);
       ...
   }
}

<UserControl x:Class="Workbench.Views.LeftSideView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:cal="http://www.caliburnproject.org"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">

    <Grid>
        <TabControl x:Name="Items" BorderThickness="0" TabStripPlacement="Bottom">
            <TabControl.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding TabText}" />
                        <!-- The grid will not appear (collapsed) if the tab cannot be closed -->
                        <Grid Visibility="{Binding CloseTabIsVisible, Converter={StaticResource BoolToVisibilityConverter}}">
                            <!-- The tab close button -->
                            <Button x:Name="CloseTab" Cursor="Hand" Focusable="False" Content="X" cal:Message.Attach="[Click] = [CloseTab($this)]" />
                        </Grid>
                    </StackPanel>
                </DataTemplate>
            </TabControl.ItemTemplate>
        </TabControl>
    </Grid>
</UserControl>

...