2

最近、MVVMライトを使用してWPFの操作を開始しましたが、次のようなものがあります(単純なシナリオ)。

  1. MainWindowには、要素のリストボックスが含まれています。

  2. 1つを選択してボタンをクリックすると、次のコマンドを実行します。

    ReservoirViewerCommand.Execute(null);
    
  3. viewmodelクラスで、コマンドをインスタンス化し、選択したオブジェクトを含むメッセージを送信します。

    ReservoirViewerCommand = new RelayCommand(OpenReservoir);
    private void OpenReservoir()
    {
        Messenger.Default.Send(new LaunchShowReservoirMessage(){Reservoir=SelectedReservoir});          
    }
    

    どこ:

    class LaunchShowReservoirMessage:MessageBase
    {
        public Reservoir Reservoir { get; set; }
    }
    
  4. メインビューはメッセージを登録し、新しい子ウィンドウを開きます。

    private void RegisterMessages() 
    {
        Messenger.Default.Register<LaunchShowReservoirMessage>(this,OnLaunchShowReservoir);
    }
    
    public void OnLaunchShowReservoir(LaunchShowReservoirMessage msg) {
        var showReservoir = new ReservoirViewerView();
        showReservoir.Show(); 
    }
    

必要なのは、新しいViewModel(ReservoirViewerViewModel)がメッセージを介して渡されたオブジェクトを何らかの方法で取得できるため、このオブジェクトの詳細を子ウィンドウに表示できることです。

ステップバイステップのデバッグを行いましたが、ViewModelコンストラクターに到達することはないようです。

4

2 に答える 2

0

「段階的なデバッグを行いましたが、ViewModelコンストラクターに到達することはないようです。」

次のいずれかを使用して、実際にビューをビューモデルにバインドしていることを確認してください。

CodeBehind

var showReservoir = new ReservoirViewerView();
showReservoir.DataContext = ViewModelLocator.ReservoirViewerViewModel; //static property
//OR showReservoir.DataContext = new ReservoirViewerViewModel();
showReservoir.Show();

Xamlビューで

<Window x:Class="Garmin.Cartography.AdminBucketTools.ChildWindowView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        
    DataContext="{Binding Path=ReservoirViewerViewModel, Source={StaticResource Locator}}">
    <!--Use the non-static property in your ViewModelLocator-->

    <Grid />
</Window>

Xamlリソースで

<DataTemplate DataType="{x:Type viewmodels:ReservoirViewerViewModel}">
    <views:ReservoirViewerView/>
</DataTemplate>

「必要なのは、新しいViewModel(ReservoirViewerViewModel)がメッセージを介して渡されたオブジェクトを何らかの方法で取得できるため、このオブジェクトの詳細を子ウィンドウに表示できることです。」

ReservoirViewerViewModelクラスに同じメッセージを登録するだけです。

Messenger.Default.Register<LaunchShowReservoirMessage>(this, (msg) =>
{
    var reservoir = msg.Reservoir;
});

参考までに、MessageBaseではなくGenericMessage <[content type]>からメッセージクラスを派生させる場合は、GenericMessageクラスの定義済みのContentプロパティを使用できます。例えば:

public class LaunchShowReservoirMessage: GenericMessage<Reservoir>
{
    public LaunchShowReservoirMessage(Reservoir content) : base(content) { }
}

その後:

Messenger.Default.Register<LaunchShowReservoirMessage>(this, (msg) =>
{
    var reservoir = msg.Content;
});
于 2012-09-19T22:15:07.460 に答える
0

私はMVVMの専門家ではありませんが、リストボックスアイテムをクリックした後に新しいビューに移動して何かを表示したい場合は、この新しいビューに表示したいオブジェクト内に新しいメッセージを送信してから、に移動します。あなたのアプローチは少し複雑だと思っているので、これを書いていますが、私はWindows Phoneアプリの開発者なので、それに応じてこのコメントを受け取ってください。

とにかく、メッセージの最初の機能はビューモデルを介した通信を許可することです。したがって、私の意見では、メッセージをReservoirViewerViewModelにも登録し、ここでmsg.Reservoirを使用してReservoirの「添付ファイル」を取得する必要があります。

ReservoirViewerViewModelの場合:

private void RegisterMessages() 
{
    Messenger.Default.Register<LaunchShowReservoirMessage>(this, ReservoirReceived);
}

private void ReservoirReceived(LaunchShowReservoirMessage msg) {
    this.LocalReservoir = msg.Reservoir;
}

public Reservoir LocalReservoir { get... set... } ...
于 2012-09-19T20:45:17.007 に答える