В C #, как я могу установить DataContext для представления из ViewModel?
-
20-08-2019 - |
Вопрос
Я & пытаюсь обернуть голову вокруг MVVM. Я многое понимаю, но мне трудно понять один аспект: Настройка DataContext .
Я хочу показать вид с определенным объектом. Пользователь не может решить, что видно, поэтому мне нужно создать представление в коде. Затем я хочу установить DataContext представления для объекта (для привязки). Я пытаюсь не помещать код в представление для этого, но View.LayoutRoot.DataContext не является общедоступным. Р>
Что мне не хватает?
пытаясь избежать этого:
public class View
{
public View(object dataContext)
{
InitializeComponent();
LayoutRoot.DataContext = dataContext;
}
}
с чем-то вроде этого:
public class ViewModel
{
...
public UIElement GetView()
{
UIElement *element = new View();
element.LayoutRoot.DataContext = element;
return element;
}
}
Решение
Не забывайте, что View должен знать о ViewModel, а не наоборот.
Так что в вашем случае помещать код в ViewModel для создания представления - не лучший способ.
статья Джоша Смита о MVVM содержит раздел о применении вида к модели представления. Он рекомендует использовать шаблоны данных WPF для выбора вида в XAML.
Другие советы
Если вы используете элемент управления XAML или Window (что должно быть в случае, если вы используете MVVM), LayoutRoot (Grid по умолчанию) является общедоступным. В вашем примере вы используете просто обычный класс для View, поэтому трудно сказать, что происходит.
Кроме того, я второе мнение Кэмерона - ни View, ни ModelView не должны заниматься назначением DataContext. Это можно сделать разными способами (DataTemplate, внедрение зависимостей, специальный класс построителя, простой код), но обычно это происходит на уровне приложения.