-1

イベントを作成したいのですが、サブスクライブは別の ViewModel にあります。イベント ハンドラーは、最初の ViewModel で常に null を取得します。最初の Viewmodel で Event を宣言し、次のように発生させました

  public event EventHandler EditSearchChanged;

として育てられた

     if (EditSearchChanged != null)
        {
            EditSearchChanged(this, null);
        }

2 番目の Viewmodel では、最初の Viewmodel のプロパティを宣言しました。

   private EditTileViewModel editTileVM;

    public EditTileViewModel EditTileVM
    {
        get
        {
            return editTileVM ?? (editTileVM = new EditTileViewModel());
        }
        set
        {
            editTileVM = value;
            RaisePropertyChanged();
        }
    }

次のようにイベントをサブスクライブします

EditTileVM.EditSearchChanged += EditTileVM_EditSearchChanged;

  private void EditTileVM_EditSearchChanged(object sender, EventArgs e)
    {
        this.EditTileVM = (sender as EditTileViewModel);
    }

デバッガーの結果 ここに画像の説明を入力

4

1 に答える 1

0

ViewModel次のプロパティで の別の新しいインスタンスを作成すると発生します。

private EditTileViewModel editTileVM;
public EditTileViewModel EditTileVM
{
    get
    {
        return editTileVM ?? (editTileVM = new EditTileViewModel());
    }
    set
    {
        editTileVM = value;
        RaisePropertyChanged();
    }
}

したがって、 の 2 つのインスタンスがありEditViewModelます。

Prism フレームワークの 2 つの間のEventAggregatorパターンを使用することをお勧めします。viewModels

// Subscribe
eventAggregator.GetEvent<CloseAppliactionMessage>().Subscribe(ExitMethod);

// Broadcast
eventAggregator.GetEvent<CloseAppliactionMessage>().Publish();

簡素化された Event Aggregator patternに関する Rachel Lim の非常に優れたチュートリアルを参照してください。

または、MVVM Light メッセンジャーを使用します。

//Subscribe
Messenger.Default.Register<CloseAppliactionMessage>(ExitMethod);

// Broadcast
Messenger.Default.Send<CloseAppliactionMessage
于 2016-04-04T13:28:30.197 に答える