-1

我想创建一个事件并订阅另一个 ViewModel。事件处理程序在第一个 ViewModel 上始终为 null。在第一个 Viewmodel 中,我声明了 Event 并提出如下

  public event EventHandler EditSearchChanged;

并提出为

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

在第二个 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();
    }
}

所以有两个实例EditViewModel

我建议您在Prism 框架中的两个之间使用EventAggregator模式:viewModels

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

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

请参阅 Rachel Lim 的关于简化事件聚合器模式的非常好的教程。

或使用MVVM Light messenger

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

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