В C #, как я могу установить DataContext для представления из ViewModel? - PullRequest
3 голосов
/ 25 июня 2009

Я пытаюсь обернуть голову вокруг 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;
    }
}

Ответы [ 2 ]

7 голосов
/ 25 июня 2009

Не забывайте, что View должен знать о ViewModel, а не наоборот.

Так что в вашем случае помещение кода в ViewModel для создания представления - не лучший способ.

Статья Джоша Смита в MVVM содержит раздел о применении View к ViewModel. Он рекомендует использовать шаблоны данных WPF для выбора вида в XAML.

0 голосов
/ 25 июня 2009

Если вы используете элемент управления XAML или Window (что должно быть в случае, если вы используете MVVM), LayoutRoot (Grid по умолчанию) является общедоступным. В вашем примере вы используете просто простой класс для View, поэтому трудно сказать, что происходит.

Кроме того, я второе мнение Кэмерона - ни View, ни ModelView не должны заниматься назначением DataContext. Это можно сделать разными способами (DataTemplate, внедрение зависимостей, специальный класс компоновщика, простой код), но обычно это происходит на уровне приложения.

...