2013-12-02 3 views
1

Я играю с Caliburn Micro в течение некоторого времени.Caliburn Micro, динамически загруженные виды/режимы просмотра

Приложение, в котором я работаю, состоит из MainAppView, MainAppMenuView и MainAppContentView. С соответствующими ViewModels. Все это прекрасно работает.

Теперь в MainAppContentView я хочу показать несколько элементов UserControl, которые выглядят как Windows 8 Startscreen Tiles, динамически. Значит, пользователь должен иметь возможность выбирать, что будет показывать приложение UserControl, из списка ListBox.

Для этого я создаю несколько видов и представлений. И теперь у вас есть коллекция различных плиток, которые пользователь может выбрать.

мысль была иметь Tile модель:

namespace CaliburnMicro.Test.Model 
{ 
    public class Tile 
    { 
     public int ID { get; set; } 
     public string View { get; set; } 
     public List<string> Views { get; set; } 
     public string TileSize { get; set; } 

    } 
} 

А потом решить, что View/ViewModel, чтобы показать из свойства Tile.View или Tile.Views.

Есть ли у кого-нибудь идеи о том, как это можно выполнить с помощью Caliburn Micro?

Я попытался решить ее в DataTemplate она позволяет так:

<DataTemplate> 
    <Grid Margin="4"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="50*" /> 
      <ColumnDefinition Width="50*" /> 
      <ColumnDefinition Width="50*" /> 
     </Grid.ColumnDefinitions> 
     <TextBlock Text="{Binding ID}" FontWeight="Bold" /> 
     <TextBox Grid.Column="1" Text="{Binding ID }" /> 
     <ContentControl Grid.Column="2" cal:View.Model="{Binding View}" /> 
    </Grid> 
</DataTemplate> 

Идеи, Линка к образцам или что-нибудь ... был бы весьма признателен.

Link to my test code

+0

Все ли плитки будут разделять одно и то же поведение (просто выглядит по-другому), или вам потребуется отдельный «ViewModel» для каждого? – Chris

+0

Привет Все плитки будут иметь один вид и один viewModel каждый. Но какой вид и ViewModel, что покажет spesific tile, должны быть определены в Tile Object. Моя мысль заключается в том, что объект Tile просто определяет пропозиции плитки как, размер, цвет, вид или виды, isSelected ... и далее. Хотя содержимое плитки будет представлением с его viewModel, и это представление/данные никоим образом не связаны с объектом tile/tile. – dlilleaa

ответ

0

Я не в данный момент где-то я могу проверить это, но я бы подойти к нему, унаследовав основание TileViewModel (или Tile) во всем моем ViewModels (хотя вы, вероятно, также определить интерфейс ITile). Это может содержать Tile информацию о местоположении, размер дисплея и другие общие правила поведения Tile.

На главной панели управления хостингом плитки, вы можете затем сохранить коллекцию Tile объектов, и каждый раз, когда вы хотите добавить новую Tile и отобразить его, вы можете добавить новый ViewModel экземпляр в коллекцию и вызова метод Caliburn.MicroActivate на новом экземпляре. С верхней части моей головы, я думаю, вы должны были бы изменить DataTemplate так cal:View.Model свойство привязан к объекту непосредственно, а не собственность, так что-то вроде cal:View.Model="{Binding}"

Caliburn.Micro следует позаботиться о разрешении ViewModel/View для каждая из этих плиток, используя встроенные соглашения. Вам нужно будет сделать управление хостингом Conductor<IScreen>.Collection.AllActive, чтобы все из были активны сразу.

Другой объект, который может представлять интерес в данной ситуации, является собственностью cal:View.Context, что позволит вам иметь несколько Views по тем же ViewModel. Таким образом, каждый из ваших может поддерживать различные Views для предоставления различной информации (или функциональности). Он кратко упоминается в documentation, и у меня была трещина при объяснении соглашения: One ViewModel, multiple views.

Я попытаюсь проверить мое предложение выше, когда у меня появится шанс, чтобы убедиться в его жизнеспособности.

+0

Thx для комментариев. У меня также было что-то подобное. Но я новичок в WPF так много нового материала в то же время, для разработки WinForms ;-) Часть C#, ViewModels и Objects по большей части понятны мне, но подключить ее к View не так, как Clear , – dlilleaa

+0

Нет проблем, стоит сыграть с 'Caliburn.Micro', вы увидите, что по-разному соблюдаются схемы« ViewModel'/'View» по соглашениям по умолчанию. Я попробую и выбью пример, если у меня появится шанс. Alway стоит держать ваши глаза открытыми для других подходов, хотя, мое предложение может быть не лучшим = D – Chris

Смежные вопросы