Как установить 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">
4 82

4 ответа:

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

В Приложение.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.ViewModels"
    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}"
    />

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

<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>

вам нужно создать экземпляр 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>

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

посмотреть в этой статье для примера.