我正在为现有应用程序实现一个小扩展。现在我正在使用 mvvm 创建一个"wpf 库",目前一切似乎都很好。
现在,假设我有一个事件要从基础数据库中删除一些数据集。我不想在我的扩展应用程序中执行此操作,而是在调用应用程序中执行此操作。
所以我所取得的成就(以及有效的)是用户单击我的"删除"按钮,视图模型实现了命令,在这里我能够触发一个事件。我想要的是将事件发送到调用应用程序。
调用应用程序现在能够像这样看到我的启动类:
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更清晰,更直接,同时仍然脱钩。这样做的好处是,您可以通过模拟数据库服务来轻松测试视图模型(例如,测试执行 Remove 命令是否有效地调用数据库上的 Delete)。
//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 );
}