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

标签 wpf events mvvm event-handling

我正在为现有应用程序实现一些扩展。现在,我正在用mvvm创建一个“wpf库”,此刻一切似乎都很好。

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

因此,我所获得的(以及有效的)是用户单击了我的“删除”按钮, View 模型实现了该命令,并且在此我可以触发事件。我想要的是将事件发送到调用应用程序。

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

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

但是在我的观点中,必须有一些更好/更清洁/更好的方法来实现这一点?

提前致谢! :)

最佳答案

确实,这似乎不是使用正常事件的正确位置。其他几个选择:

-不使用事件,而是使用“服务”,imo更加清晰和直接,同时仍保持解耦。通过模拟数据库服务,具有可以轻松测试 View 模型(例如,测试执行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 );
}

关于wpf - 将事件从ViewModel发送到调用应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11202370/

相关文章:

wpf - PowerShell ISE WPF 控件内联

c# - 如何将 MSBuild 与引用网络标准项目的 WPF 项目一起使用

wpf - 在另一个 Scrollviewer 中使用 ScrollViewer

WPF 简单绑定(bind)到 INotifyPropertyChanged 对象

javascript - 如何不让别人点击导航器的返回按钮?

wpf - 在 WPF 的 ListView 中过滤集合

c# - 无法创建 Prism 外壳

Java 等同于 Cocoa NSNotification?

javascript - 单击事件在循环中多次触发

wpf - 使用 IDataError 进行验证