私は MVVM で最初のプロジェクトに取り組んでおり、MVVM Light Toolkit を使用することにしました。GameViewModel
ゲームのメイン画面でビジネスを処理する があります。コマンドの実行時にAdventurerView
のインスタンスをパラメータとして新しいウィンドウ ( ) を開き、にバインドし、データを表示して返す方法を見つける必要があります。このウィンドウのインスタンスは頻繁に開閉されます。私はこれに数日間立ち往生しており、気が狂っています。できればMVVM Lightまたは純粋なXAMLが提供するツールを使用して、MVVMに適した方法でこれを行う方法を学びたいと思います。Adventurer
AdventurerViewModel
MVVM Light を使用してみましViewModelLocator
たがAdventurerView
、ウィンドウなので機能しません。プログラムはまだコンパイルおよび実行されますが、「スタイルにウィンドウを配置できません」と表示されます。それを機能させるために変更できるものはありますか?または、XAML でそれらをバインドする別の方法はありますか? または完全に別のアプローチですか?これから先に進むことができれば本当にうれしいです。また、MVVM Light のメッセンジャーを使用してみましたが、役に立ちませんでした (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
}
下部に動作しない DataTemplate を含む App.xaml:
<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);
}
他に何を含めればいいのかよくわかりません。