Я работаю над своим первым проектом в MVVM, и я решил использовать MVVM Light Toolkit. У меня есть GameViewModel
, который обрабатывает бизнес на главном экране моей игры. Мне нужно узнать, как открыть новое окно (AdventurerView
) с экземпляром Adventurer
в качестве параметра при выполнении команды, привязать его к AdventurerViewModel
и отобразить и вернуть данные. Экземпляры этого окна будут часто открываться и закрываться. Я застрял на этом пару дней, и это сводило меня с ума. Я хотел бы узнать, как это сделать с помощью MVVM-friendly, желательно с инструментами, предоставляемыми MVVM Light или чистым XAML.
Я пробовал использовать MVVM Light ViewModelLocator
, но так как AdventurerView
- это окно, это не сработает; он говорит: "Невозможно поместить окно в стиль", хотя программа все еще компилируется и запускается. Может ли быть что-то, что я мог бы изменить, чтобы сделать эту работу? Или есть другой способ связать их в XAML? Или другой подход полностью? Мне бы очень хотелось, чтобы я мог двигаться дальше. Я также попытался использовать MVVM Light messenger безрезультатно (что еще не решает проблему View/ViewModel).
Мне просто нужно создать окно, привязанное к AdventurerViewModel
, и отобразить/вернуть соответствующие данные.
В настоящее время состояние AdventurerView.xaml находится в состоянии по умолчанию, но я чувствую, что если бы я мог привязать соответствующие данные, которые могут помочь (DataContext).
AdventurerViewModel также довольно голые кости
class AdventurerViewModel : ViewModelBase
{
#region Members
private Adventurer _adv;
#endregion
#region Properties
public Adventurer Adv
{
get { return _adv; }
set { _adv = value; }
}
#endregion
#region Construction
public AdventurerViewModel(Adventurer adv)
{
this._adv = adv;
}
#endregion
}
App.xaml с нерабочим DataTemplate внизу:
<Application StartupUri="MainWindow.xaml"
xmlns:views="clr-namespace:AoW.Views"
xmlns:vm="clr-namespace:AoW.ViewModels"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="AoW.App"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Application.Resources>
<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
<DataTemplate DataType="{x:Type vm:GameViewModel}">
<views:GameView />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:TitleViewModel}">
<views:TitleView />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:AdventurerViewModel}">
<views:AdventurerView />
</DataTemplate>
</Application.Resources>
</Application>
Команда в GameViewModel
, которая, как мы надеемся, сделает все это (сообщение только подтверждает, что команда запускается):
private void ExecuteShowAdvCommand(Adventurer adv)
{
System.Windows.MessageBox.Show(adv.Name);
}
Я не знаю, что еще включить.