Присоединение ViewModel к DataContext и хранение предложений IntelliSense в xaml - PullRequest
0 голосов
/ 26 апреля 2020

Я использую WPF MVVM с. NET Core 3.1.

Теперь для установки MainWindow 'DataContext Я использую следующий xaml

<Window.DataContext>
    <local:MainViewModel/>
</Window.DataContext>

Это полностью работает для меня.

Но иногда я получаю предупреждения в комментариях StackOverflow под моим кодом, что я делаю это неправильно, почти ломая MVVM . Msgstr "Потому что View не должен вызывать конструктор ViewModel". (Почему?)

Я пытался установить его в конструкторе MainWindow

public MainWindow()
{
    InitializeComponent();
    DataContext = new MainViewModel();
}

И в Onstartup(), как предложено здесь

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);
    MainWindow window = new MainWindow();
    window.DataContext = new MainViewModel();
    window.Show();
}

Но два вышеупомянутых решения не позволяют предложениям IntelliSense работать в xaml.

Затем я нашел некоторую информацию о времени разработки и попробовал ее как дополнение к вышеуказанным решениям

<d:Window.DataContext>
    <local:MainViewModel/>
</d:Window.DataContext>

Конструктор появился в связи со свойствами ViewModel, но это не повлияло на предложения IntelliSense. Мне нужны предложения, потому что это защищает меня от опечаток и делает меня быстрее.

Что я пропустил?

1 Ответ

1 голос
/ 27 апреля 2020

Вы можете объявить ваши ViewModels в App.xaml как ресурсы и дать им ключи

 <Application.Resources>
     <local:MainViewModel x:Key="MainViewModel" />
 </Application.Resources>

Затем вы будете использовать их как DataContext в представлениях, таких как:

DataContext="{StaticResource MainViewModel}"

В этом случае вы объявляйте их только один раз и можете использовать их где угодно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...