是否可以使用在其他ObservableCollection中添加/删除的项目来更新ObservableCollection?
添加或从FullyObservableCollection中删除项目时,如何更新ViewModel的BindableCollection?
重要的是要注意我正在尝试在Caliburn.Micro中使用MVVM模式。
VieModel
private BindableCollection<Employees> _employees = new BindableCollection(OracleConnector.GetEmployeeRepositorys());
public BindableCollection<Employees> Employees
{
get
{
return _employees;
}
set
{
OracleConnector.List.CollectionChanged += (sender, args) =>
{
_employees = OracleConnector.List;
};
NotifyOfPropertyChange(() => Employees);
}
}
OracleConnector
public class OracleConnector
{
public static FullyObservableCollection<Employees> List = new FullyObservableCollection<Employees>();
public static FullyObservableCollection<Employees> GetEmployeeRepositorys()
{
using (IDbConnection cnn = GetDBConnection("localhost", 1521, "ORCL", "hr", "hr"))
{
var dyParam = new OracleDynamicParameters();
try
{
var output = cnn.Query<Employees>(OracleDynamicParameters.sqlSelect, param: dyParam).AsList();
foreach (Employees employees in output)
{
List.Add(employees);
}
}
catch (OracleException ex)
{
MessageBox.Show("Connection to database is not available.\n" + ex.Message, "Database not available", MessageBoxButton.OK, MessageBoxImage.Error);
}
return List;
}
}
}
我能够检测是否在FullyObservableCollection中进行了更改,但是我不知道如何将它们传递给ViewModel。
答案 0 :(得分:0)
添加新员工时,请使用IEventAggregator
类中的OracleConnector
。发布包含新员工的EmployeeAddedMessage
。确保您也在正确的线程上发布。您可能需要使用PublishOnUiThread
方法。然后ShellViewModel
可以将IHandle<EmployeeAddedMessage>
实现为一种可能称为Handle(EmployeeAddedMessage msg)
的方法。然后,您可以在Handle
方法内部,将Employee
添加到适当的Employee
集合中。
您可能需要将OracleConnector
和Caliburn Micro提供的EventAggregator
类添加到应用程序引导程序中。您的ShellViewModel
还需要在事件聚合器上调用Subscribe(this)
方法。 OracleConnector
和ShellViewModel
都需要使用事件通知程序的相同实例。因此,请确保将事件聚合器注册为单例。