6

私は MVVM で最初のプロジェクトに取り組んでおり、MVVM Light Toolkit を使用することにしました。GameViewModelゲームのメイン画面でビジネスを処理する があります。コマンドの実行時にAdventurerViewのインスタンスをパラメータとして新しいウィンドウ ( ) を開き、にバインドし、データを表示して返す方法を見つける必要があります。このウィンドウのインスタンスは頻繁に開閉されます。私はこれに数日間立ち往生しており、気が狂っています。できればMVVM Lightまたは純粋なXAMLが提供するツールを使用して、MVVMに適した方法でこれを行う方法を学びたいと思います。AdventurerAdventurerViewModel

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);
    }

他に何を含めればいいのかよくわかりません。

4

2 に答える 2

1

Viv に続いて、コード ビハインドを使用せずにウィンドウを開く例を含めるようにサンプルを変更しました。

サンプルプロジェクトはこちら。

コード ビハインドの代わりにビューモデルとウィンドウとデータ コンテキストを更新する静的メソッドで ViewModelLocator シングルトンを利用しています。

詳細を含むブログ投稿。 どの方法が好ましいか教えてください。コードビハインドの使用は嫌いですが、見落としている長所と短所がある可能性があります。

于 2013-09-05T20:38:39.537 に答える