其他ObservableCollection发生更改时,BindableCollection也发生更改

时间:2019-03-07 12:52:28

标签: wpf observablecollection caliburn.micro

是否可以使用在其他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。

1 个答案:

答案 0 :(得分:0)

添加新员工时,请使用IEventAggregator类中的OracleConnector。发布包含新员工的EmployeeAddedMessage。确保您也在正确的线程上发布。您可能需要使用PublishOnUiThread方法。然后ShellViewModel可以将IHandle<EmployeeAddedMessage>实现为一种可能称为Handle(EmployeeAddedMessage msg)的方法。然后,您可以在Handle方法内部,将Employee添加到适当的Employee集合中。

您可能需要将OracleConnector和Caliburn Micro提供的EventAggregator类添加到应用程序引导程序中。您的ShellViewModel还需要在事件聚合器上调用Subscribe(this)方法。 OracleConnectorShellViewModel都需要使用事件通知程序的相同实例。因此,请确保将事件聚合器注册为单例。

有关使用事件通知的更多详细信息,请参见here。另外,我的应用程序here使用事件通知来通知应用程序事件。