#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