В моем главном Window1.xaml.cs я строй ObservableCollection из ViewModels, как это, инстанцирования с LINQ-to-SQL модели объектом:Пропускает L2S DataContext в конструктор ViewModel, очищающий MVVM?
using (var db = Datasource.GetContext())
{
var customers = from c in db.Customers
select c;
foreach (var customer in customers)
{
CustomerCollection.Add(new CustomerModelView(customer));
}
}
В конструкторе каждого ViewModel, я сохранить объект LINQ-to-SQL внутренне и отобразить все свойства от модели к ViewModel:
#region ViewModelProperty: Customer
private Customer _customer;
public Customer Customer
{
get
{
return _customer;
}
set
{
_customer = value;
OnPropertyChanged("Customer");
}
}
#endregion
#region ViewModelProperty: FirstName
private string _firstName;
public string FirstName
{
get
{
return _firstName;
}
set
{
_firstName = value;
OnPropertyChanged("FirstName");
}
}
#endregion
...
public CustomerViewModel(Customer customer)
{
Customer customer;
FirstName = customer.FirstName;
...
}
проблема заключается в том, что при обработке событий в моей ViewModel, например, после того, как пользователь изменит какое-либо из полей и нажмет кнопку Save
, мне нужно: восстановить объект объект LINQ-to-SQL, чтобы сохранить изменения, которые требуют больше трафика в базу данных и из нее, когда у меня уже был объект сохраняются внутри:
using (var db = Datasource.GetContext())
{
var customer = (from c in db.Customers
where c.Id == Id
select c).SingleOrDefault();
customer.FirstName = FirstName;
db.SubmitChanges();
}
непосредственным решение передать LINQ-to-SQL DataContext объект до ViewModel, а при инстанцировании ViewModel, как это:
public CustomerViewModel(Customer customer, DataClasses1DataContext db)
{
Customer = customer;
Db = db;
FirstName = customer.FirstName;
...
}
, а затем, когда обработка моих событий s uch как кнопка Save
, я мог бы просто позвонить SubmitChanges()
на внутренняяDb
переменная, не восстанавливая ее и снова получая данные из базы данных.
Так что, кажется, я должен либо (1) передать контекст datalayer объекта в ViewModel, который не кажется, как чистого MVVM пути решения этой проблемы, или (2) я должен refetch мои LINQ to-SQL каждый раз, когда я хочу сохранить объект модели, который я уже сохранил внутренне в ViewModel.
Каков самый чистый подход MVVM для решения этой дилеммы?
+1 для прикрепления. Это правильный подход. Имейте ViewModels, чтобы сохранить объект модели в свойстве Model и просто использовать attach при круговом отключении. –
@ Андерсон: Я не думаю, что привязка объекта модели к viewmodel - хорошая идея на самом деле. Он не получает сериализованности назад, когда круговое отключение истинно на странице, и это также вводит плотную связь двух. Viewmodel должен просто содержать данные, не более того. –
Это * View ** Model * Это точка. Оба слова важны здесь. Я видел, как многие люди вводили новую конструкцию, такую как контроллер, который действует как смазочный слой между моделью просмотра и моделью, но я бы не счел это обязательным. –