从ViewModel发送事件到调用应用程序

时间:2012-06-26 07:13:43

标签: wpf events mvvm event-handling

我正在为现有应用程序实现一点扩展。现在我用mvvm创建一个'wpf-library',目前一切看起来都很不错。

现在假设我有一个从基础数据库中删除一些数据集的事件。我不想在我的扩展应用程序中执行此操作,而是在调用应用程序中执行此操作。

所以我所取得的成就(以及最新工作)是用户点击我的'删除'按钮,视图模型实现了命令,在这里我可以发起一个事件。我想要的是将事件发送到调用应用程序。

我的启动类,调用应用程序现在可以看到这样:

    public UserControl ViewToShowInContainer { get; private set; }

    public StartMyExtensionApplication(Model.TransportClass dataToWorkWith)
    {
        ViewToShowInContainer = new View.MainView();
        (ViewToShowInContainer.DataContext as VehicleSearchWPF.ViewModel.MyMainViewModel).RemoveSelectStatementFromDB += new EventHandler<SelectStatementRemovedEventArgs>(StartVehicleSearch_RemoveSelectStatementFromDB);
        LocalDataToWorkWith.MapTransportClass(dataToWorkWith);
    }

    void StartVehicleSearch_RemoveSelectStatementFromDB(object sender, SelectStatementRemovedEventArgs e)
    {
        throw new NotImplementedException();
    }

但在我的意见中,必须有一些更好/更清洁/更好的方法来实现它?

提前致谢! :)

1 个答案:

答案 0 :(得分:1)

这似乎不是使用正常事件的正确场所;其他两个选择:

- 不要使用事件,而是使用'服务',imo更清晰,更直接,同时仍然脱钩。您可以通过模拟数据库服务轻松测试您的viewmodel(例如,测试执行Remove命令有效地调用数据库上的Remove)。

  //a database interface
public interface IDataBase
{
  public void Remove( string entry );
  //etc
}

  //a concrete database
public class SqlDataBase : IDataBase
{
  //implementation of IDataBase
}

  //vm uses an IDataBase
class VehicleSearchViewModel
{
  public VehicleSearchViewModel( IDataBase dataBase );

  private void Remove( string id )
  {
    dataBase.Remove( id );
  }
}

  //so main app can pass it
public StartMyExtensionApplication( .... )
{
  var dataBase = CreateDataBase( .... );
  view.DataContext = new VehicleSearchViewModel( dataBase );
}

- 使用类似Prism的IEventAggregator

class VehicleSearchViewModel
{
  public VehicleSearchViewModel( IEventAggregator aggr );

  private void Remove( string id )
  {
    aggr.Publish( new RemoveFromDBEvent{ id = id } );
  }
}

public StartMyExtensionApplication( .... )
{
  aggr.Subscribe<RemoveFromDBEvent>( DoRemove );
}

private void DoRemove( RemoveFromDBEvent evt )
{
  dataBase.Remove( evt.id );
}