Как установить ViewModel для окна в XAML, используя свойство DataContext? - PullRequest
86 голосов
/ 04 января 2011

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

У меня есть окно, и я пытался установить 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 ]

132 голосов
/ 04 января 2011

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

<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>
105 голосов
/ 04 января 2011

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

В 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.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}"
    />
10 голосов
/ 04 января 2011

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

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

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

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