Как установить 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 ответа:
в дополнение к решению, которое предоставили другие люди (которые хороши и правильны), есть способ указать 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.
посмотреть в этой статье для примера.