Добавление различных пользовательских элементов управления в сетку в WPF с использованием MVVM

У меня до сих пор есть пять разных пользовательских элементов управления, и в будущем их число может увеличиться. Я хочу добавить их в сетку, используя шаблон MVVM.

У меня есть класс Apparatus, который может служить моделью представления для UserControl.

public class Apparatus 
{
    private string _appratusName;
    private string _imageSource;
    private string _experiments;
    private GridProperties gridProps;

    public Apparatus()
    {
        _appratusName = "";
        _imageSource = "";
        Experiments = "";
    }

    public Apparatus(string name, string imgSource, string exp)
    {
        _appratusName = name;
        _imageSource = imgSource;
        _experiments = exp;

    }}

GridProperties — это еще один класс для хранения положения пользовательских элементов управления в сетке.

public class GridProperties
{
    public int Row;

    public int Column;

    public int ColumnSpan;

    public int RowSpan;

    public GridProperties(int row, int col, int rowSpan, int columnSpan)
    {
        this.Row = row;
        this.Column = col;
        this.RowSpan = rowSpan;
        this.ColumnSpan = columnSpan;
    }

для каждого поля в классах существуют общедоступные свойства.

а также есть ExperimentGridViewModel, вроде

    public class ExperimentGridViewModel : ViewModelBaseClass
{
    private int _apparatusCount;
    private string _workingExperiment;
    private int _gridRowCount;
    private int _gridColumnCount;
    private ExperimentWindowViewModel _windowModel;

    private ObservableCollection<Apparatus> _apparatusAppplied;}

Я хочу добавить пользовательские элементы управления, которые в основном представляют собой такие устройства, как Burette, pippete и т. д., использующие MVVM.

Я просмотрел несколько ответов на этот вопрос и обнаружил, что это можно сделать с помощью DataTemplates и ItemsControl, но проблема в том, что у меня есть только один тип данных, то есть Apparatus для всех мои пользовательские элементы управления, нужно ли мне создавать разные классы для каждого пользовательского элемента управления или есть что-то еще, что я могу сделать.

Теперь все, что я могу сделать, это что-то вроде этого.

<Grid.Resources>
        <DataTemplate DataType="{x:Type model:Apparatus }">
            <apparatuses:Burette></apparatuses:Burette>
        </DataTemplate>
    </Grid.Resources>
    <ItemsControl ItemsSource="{Binding AppliedApparatus}" >

    </ItemsControl>

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

Кроме того, может ли кто-нибудь показать мне, как я могу привязать GridProperties в моей модели представления к прикрепленным свойствам сетки UserControls.


person Manish Singh    schedule 15.10.2015    source источник
comment
Либо вы создаете разные классы модели представления — все производные от Apparatus — для которых вы можете объявить разные DataTemplates, либо вы используете DataTemplateSelector (т. е. устанавливаете свойство ItemTemplateSelector ItemsControl).   -  person Clemens    schedule 15.10.2015
comment
Хорошо, я попробую это, но не могли бы вы помочь мне привязать значение Grid.Column ‹apparatus:Burette› к GridProperty.Column, присутствующему в классе Apparatus.   -  person Manish Singh    schedule 15.10.2015
comment
Являются ли объекты UserControl разными типами в зависимости от экземпляра Apparatus? Если нет, вам не нужно объявлять разные классы для моделей представления или использовать DataTemplateSelector. Что касается вышеизложенного, самая большая вещь, которая кажется неуместной, — это использование private полей, где обычно используются public свойств (для привязки). Но без четкого описания проблемы и хорошего, минимального, полного примера кода который достоверно воспроизводит эту проблему, невозможно точно знать, что именно вы спрашиваете, не говоря уже об ответе.   -  person Peter Duniho    schedule 15.10.2015
comment
В самом вопросе я указал, что для каждого поля в классах есть общедоступные свойства, я не включал их, так как это излишне заполнило бы пространство, и да, пользовательский элемент управления бывает разных типов.   -  person Manish Singh    schedule 15.10.2015
comment
Это очень легко сделать с помощью триггеров данных, просто добавьте стиль в свой UserControl и добавьте отдельный триггер данных для каждого типа устройства, который соответствующим образом устанавливает свойство Template.   -  person Mark Feldman    schedule 16.10.2015
comment
См., например. этот ответ для ItemContainerStyle, который связывает свойства Grid.Column и Grid.Row.   -  person Clemens    schedule 16.10.2015