Внедрение зависимостей: присвоение пользовательских элементов управления определенным ячейкам сетки - PullRequest
1 голос
/ 12 января 2012

Я новичок в MVVM / WPF и знаю, как использовать элементы управления макетом Grid и StackPanel. Каков наилучший способ сделать макет, похожий на этот:

-------------------------
|      Navigation       |
-------------------------
|         |             |
| Summary |   Details   |
|         |             |
-------------------------
|      Extra Data       |
-------------------------

Как только у меня есть макет, как мне получить правильные представления в правильные ячейки. Каждая отдельная область («Навигация», «Сводка» и т. Д.) Будет иметь свою собственную View / ViewModel.

Я думал о паре разных методов, но не уверен, какие (если таковые имеются) лучше.

Метод 1 Встроенная сетка вроде такой

<Grid>
   <Row>  (Navigation)
   <Row>  
      <Grid>
         <Column>  (Summary)
         <Column>  (Detail)
      </Grid>
   <Row>  (Extra)
</Grid>

Требуются охватывающие столбцы, в которых я не уверен, является ли это хорошей практикой или нет.

Метод 2 Встроенный просмотр

<Grid>
   <Row>  (Navigation)
   <Row>  (Summary/Details defined by a another view containing 2 columns)
   <Row>  (Extra)
</Grid>

Может также использовать StackPanel вместо Grid для метода 2

С помощью любого метода (или чего-то еще) как мне указать, какая ячейка получает какое представление? Например, у меня есть следующее в MainWindowViewModel:

    public MainWindowViewModel()
    {

        NavigationViewModel navigationViewModel = new NavigationViewModel();
        this.ViewModels.Add(navigationViewModel);

        SummaryViewModel summaryViewModel = new SummaryViewModel ();
        this.ViewModels.Add(summaryViewModel);

        DetailViewModel detailViewModel= new DetailViewModel();
        this.ViewModels.Add(detailViewModel);


        ExtraDataViewModel extraDataViewModel = new ExtraDataViewModel ();
        this.ViewModels.Add(extraDataViewModel);
   }


        private ObservableCollection<ViewModelBase> _viewModels;
        public ObservableCollection<ViewModelBase> ViewModels
        {
            get
            {
                if (_viewModels == null)
                {
                    _viewModels = new ObservableCollection<ViewModelBase>();
                }
                return _viewModels;
            }
        }

И в MainWindowView у меня есть это:

<Window.Resources>
    <ResourceDictionary Source="MainWindowResources.xaml" />
</Window.Resources>


<Grid>
    <Grid.RowDefinitions>
       <RowDefinition Height="100" />
       <RowDefinition Height="*" />
       <RowDefinition Height="50" />
    </Grid.RowDefinitions>
    <ItemsControl ItemsSource="{Binding ViewModels}" Margin="3" /> 
</Grid>

Просто не уверен, как подключиться к ItemsSource, чтобы указать правильный вид в правильной ячейке.

Ответы [ 2 ]

1 голос
/ 12 января 2012

Prism или Caliburn.Micro - действительно отличные инструменты для создания составных пользовательских интерфейсов. Я бы не стал прилагать усилия для создания этой функциональности самостоятельно.


Обновление

Если вы не хотите вводить другие фреймворки, я бы рекомендовал вам использовать Grid для общего макета и поместить ItemsControls в ячейки Grid. Используйте DataTemplate, чтобы соединить ваши модели просмотра с их соответствующим видом.

1 голос
/ 12 января 2012

Существует несколько способов размещения основного вида, например, с помощью DockPanel или Grid, как в первом примере.В этом случае вам не нужно расширять столбцы, потому что вы используете вложенные сетки, но в любом случае вполне допустимо охватывать столбцы.

Что касается моделей ваших представлений, я бы выставил каждый из 4 подвидов.модели как собственное отдельное свойство, а не имеют коллекцию всех моделей представлений.Это облегчает позиционирование каждого вложенного представления на главном представлении.

Я хотел бы изучить использование инфраструктуры MVVM, такой как Caliburn.Micro , которая делает состав представления очень простым.Это также значительно упростит такие вещи, как вызов глаголов (методов) в ваших моделях представления из вашего представления.

Существуют и другие платформы, такие как Prism , которые предлагают решения для композиции представления.

...