Я относительно новичок в MVVM, и мне интересно, как лучше всего структурировать мое приложение. Вот образец моих моделей:
public class ModelSource : ModelBase
{
#region Fields
private int _isLoading;
private BackgroundWorker worker = new BackgroundWorker();
private ObservableCollection<PCDatabase> _databases;
#endregion //Fields
#region Properties
public ObservableCollection<PCDatabase>Databases
{
get
{
if (_databases == null)
{
_databases = new ObservableCollection<PCDatabase>();
}
return _databases;
}
set
{
_databases = value;
this.OnPropertyChanged("Databases");
}
}
public int IsLoading
{
get
{
return _isLoading;
}
set
{
_isLoading = value;
OnPropertyChanged("IsLoading");
}
}
#endregion
#region Methods
/// <summary>
/// Gets all Databases from the Server
/// </summary>
public void getDatabasesAsync(ConfigDatabaseConnection _currentConfig)
{
//execute SQL Query...
}
(ModelBase реализует INotifyPropertyChanged).
Вот моя соответствующая ViewModel:
namespace DbRestore.ViewModel
{
public class ViewModelSource : ViewModelBase
{
private ObservableCollection<PCDatabase> _databases;
private ModelSource _modelSource;
private ICommand _populateDatabaseCommand;
public ConfigDatabaseConnection _currentConfig;
public ViewModelSource()
{
this.ModelSource = new ModelSource();
}
#region Commands
/// <summary>
/// Command that opens a Database Connection Dialog
/// </summary>
public ICommand OpenDataBaseConnectionCommand
{
get
{
if (_populateDatabaseCommand == null)
{
_populateDatabaseCommand = new RelayCommand(
param => this.PopulateDatabases()
);
}
return _populateDatabaseCommand;
}
}
public ObservableCollection<PCDatabase> Databases
{
get
{
return _databases;
}
set
{
_databases = value;
OnPropertyChanged("Databases");
}
}
#endregion //Commands
public void PopulateDatabases()
{
ModelSource.getDatabasesAsync(_currentConfig);
}
Вызов ModelSource.getDatabasesAsync (_currentConfig) получает мои данные SQL в моей модели. Из-за того, что некоторые из моих SQL-запросов довольно сложны, я реализовал Background Worker, который выполняет эти запросы асинхронно.
Как мне получить данные в моей ViewModel, которая привязана к моему View? Или мой подход к дизайну в целом ошибочен?
Вещи, которые я рассмотрел и попробовал:
Привязка напрямую к модели: работает, но мне сказали, что это плохая практика, и логика приложения должна находиться в модели.
Перенос SQL-запросов в ViewModel: тоже работает, но тогда мой класс Model кажется избыточным - это был бы не что иное, как настраиваемый тип данных.
Выполняйте запросы синхронно и напрямую назначайте Observable Collection в моей модели наблюдаемой коллекции в моей ViewModel. Также работает, но тогда у меня возникают проблемы с моим BackgroundWorker, потому что ViewModel не узнает, когда запрос действительно завершен.
PropertyChanged
, проверьте, была ли онаnameof(ModelSource.Databases)
, и если она сталаfalse
, данные загружаются (?), Обновите свойства, используемые в привязках. - person Sinatr   schedule 10.02.2016