В C #, как я могу установить DataContext для представления из ViewModel?

StackOverflow https://stackoverflow.com/questions/1044365

Вопрос

Я & пытаюсь обернуть голову вокруг 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, внедрение зависимостей, специальный класс построителя, простой код), но обычно это происходит на уровне приложения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top