Что касается Caliburn.Micro, я хотел бы узнать о плюсах и минусах представления объекта EF4 как свойства ViewModel (метод, обсуждаемый здесь и здесь а>). Это позволяет мне не писать геттеры и сеттеры для каждого поля (см. OneCustomer ниже). Недостатком является то, что мне нужно написать все операторы привязки в XAML (ниже LastName не находится в ViewModel, но требует привязки XAML). Если я буду придерживаться предписанной техники заполнения моей ViewModel свойствами для каждого поля (как FirstName ниже), мне в конечном итоге придется написать тонну дополнительного кода только для того, чтобы вызывался NotifyOfProperyChange. Приложение будет довольно большим. Должен ли я предоставлять каждый объект как свойство ViewModel?
В моей модели представления:
private MyEntities _context = new MyEntities();
private BindableCollection<Customer> _custBindableCollection;
private Customer _oneCustomer;
private string _firstName;
public void Load()
{
_custBindableCollection = new BindableCollection<Customer>(_context.Customers.Where(row => row.CustomerType == "FOO"));
AllCustomers = _custBindableCollection;
_oneCustomer = _custBindableCollection.FirstOrDefault();
FirstName = _oneCustomer.FirstName;
OneCustomer = _oneCustomer;
}
public BindableCollection<Customer> AllCustomers
{
get { return _custBindableCollection;}
set {_custBindableCollection = value;
NotifyOfPropertyChange(() => AllCustomers);}
}
public Customer OneCustomer
{
get { return _oneCustomer;}
set { _oneCustomer = value;
NotifyOfPropertyChange(() => OneCustomer);}
}
public string FirstName
{
get { return _firstName; }
set {
_firstName = value;
_oneCustomer.FirstName = value;
NotifyOfPropertyChange(() => FirstName);
NotifyOfPropertyChange(() => CanSaveChanges);
}
}
public void SaveChanges()
{ _context.SaveChanges(); }
public bool CanSaveChanges { get { return IsValid; } }
На мой взгляд:
<StackPanel>
<StackPanel Orientation="Horizontal">
<Label Content="First Name:" />
<TextBox x:Name="FirstName" />
</StackPanel>
<StackPanel Orientation="Horizontal" DataContext="{Binding Path=OneCustomer}">
<Label Content="Last Name:" />
<TextBox x:Name="LastName" Text="{Binding LastName}" />
</StackPanel>
<Button Content="Load Data" x:Name="Load" />
<Button Content="Save" x:Name="SaveChanges" />
<DataGrid x:Name="AllCustomers" />
Thanks in advance.