Как сгенерировать строки и столбцы сетки в WPF MVVM без редактирования представления?

#c# #wpf #mvvm

#c# #wpf #mvvm

Вопрос:

Я понимаю, что идея MVVM заключается в том, чтобы отделить представление от Viewmodel, и что отставание кода в представлении — это плохо.

Именно так я генерировал определенное количество столбцов, когда не следовал MVVM (xaml.cs).

 for (int i = 0; i < Constants.GRID_COLUMN_NUMBER; i  )
{
    ColumnDefinition tempColumn = new ColumnDefinition();
    gridName.ColumnDefinitions.Add(tempColumn);
}
 

Поскольку доступ к сетке из ViewModel для генерации строк / столбцов — это плохо, какой был бы наиболее эффективный способ добиться этого?

Будет ли приемлемым решением использование пользовательского элемента управления с кодом?

Комментарии:

1. «этот код в представлении — это плохо» — ???. Если вы говорите, что понимаете это, объясните, ПОЧЕМУ это так?

2. » отделить представление от Viewmodel » хорошо, но » отставание от кода в представлении — это плохо » — это большое заблуждение. MVVM ничего не говорит о последнем.

3. Нет абсолютно ничего плохого в коде в контексте MVVM, если он используется для обеспечения работы представления. Что противоречит MVVM, так это код, связанный с бизнес-логикой или другими функциями, связанными с данными.

4. В университете меня учили, что если я буду следовать MVVM, у меня не должно быть кода в View code-behind. Судя по вашему тону, я могу только предположить, что есть код, которому разрешено находиться в представлении. Я знаю, что не весь код исключен из представления, но я не уверен, что это то, что мне нужно.

5. Генерация столбцов для гриндинга должна быть в представлении, потому что это явно связано с тем, как это выглядит для пользователя. Итак, здесь все в порядке. Имейте в виду, что view, viewmodel и model являются частью уровня пользовательского интерфейса. Основная логика даже стоит за этим. В части модели вы по существу структурируете данные, а viewmodel содержит логику для взаимодействия пользователя с данными. Представление — это то, на что оно похоже, поэтому оно связано с xaml (если вы используете WPF).

Ответ №1:

Для этой цели можно использовать поведение. Вам не нужно добавлять код в свое представление, вы просто создаете выделенный класс, который отвечает за генерацию сеток как a Behavior<Grid> , и добавляете его в свой xaml.

Затем Behavior<Grid> их также можно подвергнуть модульному тестированию отдельно.

Microsoft Blend использует этот подход.

например

public class DynamicColumn : Behavior<Grid> {}

и вы используете это так

 <Grid>
   <Interaction.Behaviors>
      <DynamicColumn />
   </Interaction.Behaviors>
<Grid>
 

Вы можете найти больше информации здесь: https://www.wpftutorial.net/Behaviors.html