Как установить ViewModel в окне в XAML с использованием свойства DataContext?

Вопрос в значительной степени говорит обо всем.

У меня есть окно, и я попытался установить DataContext, используя полное пространство имен в ViewModel, но, похоже, что-то не так.

<Window x:Class="BuildAssistantUI.BuildAssistantWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    DataContext="BuildAssistantUI.ViewModels.MainViewModel">

Ответ 1

В дополнение к решению, которое предоставили другие люди (которые хороши и правильны), есть способ указать ViewModel в XAML, но все же отделить конкретную ViewModel от представления. Разделение их полезно, когда вы хотите написать изолированные тестовые примеры.

В App.xaml:

<Application
    x:Class="BuildAssistantUI.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:BuildAssistantUI"
    StartupUri="MainWindow.xaml"
    >
    <Application.Resources>
        <local:MainViewModel x:Key="MainViewModel" />
    </Application.Resources>
</Application>

В MainWindow.xaml:

<Window x:Class="BuildAssistantUI.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    DataContext="{StaticResource MainViewModel}"
    />

Ответ 2

Попробуйте это вместо.

<Window x:Class="BuildAssistantUI.BuildAssistantWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:VM="clr-namespace:BuildAssistantUI.ViewModels">
    <Window.DataContext>
        <VM:MainViewModel />
    </Window.DataContext>
</Window>

Ответ 3

Вам нужно создать экземпляр MainViewModel и установить его как datacontext. В вашем заявлении он просто рассматривает его как строковое значение.

     <Window x:Class="BuildAssistantUI.BuildAssistantWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:BuildAssistantUI.ViewModels">
      <Window.DataContext>
        <local:MainViewModel/>
      </Window.DataContext>

Ответ 4

Возможно, вы захотите попробовать Catel. Он позволяет определить класс DataWindow (вместо Window), и этот класс автоматически создает для вас модель представления. Таким образом, вы можете использовать объявление ViewModel так же, как и в своем исходном сообщении, и модель представления все равно будет создана и настроена как DataContext.

См. эту статью для примера.