более активные экраны / представления в оболочке caliburn micro или в другой среде MVVM - PullRequest
2 голосов
/ 06 августа 2011

Возможно использование более активного экрана / вида в одной оболочке, если я использую caliburn micro?

Примерно так: код для вида оболочки - окно wpf:

        <ContentControl x:Name="ActiveItem_1" Grid.Row=1/>

        <ContentControl x:Name="ActiveItem_2" Grid.Row=2/>


        <ContentControl x:Name="ActiveItem_9" Grid.Row=9/>

Спасибо за совет, или в каком MVVM это возможно?

Ответы [ 2 ]

2 голосов
/ 09 мая 2014

В случае проводника AllActive вы унаследуете коллекцию Items в вашей ShellViewModel.При вызове ActivateItem(vm) View Model будет добавлен в коллекцию Items, а при вызове DeactivateItem(vm, close: true) - удален.Затем в ShellView.xaml вы можете привязать Items (набор моделей просмотра) к ItemsControl.

MyView.xaml

<UserControl x:Class="AllActive_Test.MyView"
             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" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
  <Grid>
    <TextBlock Text="{Binding Path=MyProperty}"/>
  </Grid>
</UserControl>

MyViewModel.cs

class MyViewModel : Screen
{
    private int myVar;

    public int MyProperty
    {
        get
        {
            return myVar;
        }
        set
        {
            myVar = value;
            this.NotifyOfPropertyChange(() => MyProperty);
        }
    }
}

ShellView.xaml

<Window x:Class="AllActive_Test.ShellView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:cal="http://www.caliburnproject.org"
        Width="300" Height="300">

    <Grid Background="White">
    <ItemsControl ItemsSource="{Binding Path=Items}">
      <ItemsControl.ItemTemplate>
        <DataTemplate>
          <ContentControl cal:View.Model="{Binding}"/>
        </DataTemplate>
      </ItemsControl.ItemTemplate>
    </ItemsControl>
    </Grid>
</Window>

ShellViewModel.cs

public class ShellViewModel : Conductor<Screen>.Collection.AllActive, IShell
{
    public ShellViewModel()
    {
        for (int i = 0; i < 3; i++)
        {
            MyViewModel vm = new MyViewModel();
            vm.MyProperty = i;
            ActivateItem(vm);
        }
    }
}

ShellView containing 3 active Screens

2 голосов
/ 06 августа 2011

Да.Это возможно с ...

Conductor<T>.Collection.AllActive

См. Экраны, проводники и композиция страница документа.

  1. Наследуйте класс выше в ShellViewModel.
  2. Заполните свойство Items ShellViewModel с помощью ViewModels для представлений, которые вы хотите отобразить в ShellView.
  3. Свяжите свойство ItemsSource элемента ItemsControl (вам не нужен элемент ItemTemplate) в ShellView сСвойство items в ShellViewModel.

Я вполне уверен, что Caliburn.Micro позаботится об остальном, но я не могу сейчас проверить.

...