Z Caliburn.Micro Chciałbym poznać zalety i wady eksponowania jednostki EF4 jako własności ViewModel (technika omawiana pod numerem hereand here). Pozwala mi to uniknąć pisania modułów pobierających i ustawiających dla każdego pola (zobacz OneCustomer poniżej). Wadą jest to, że muszę napisać wszystkie instrukcje wiążące w XAML (poniżej LastName nie jest w ViewModelu, ale wymaga powiązania XAML). Jeśli będę trzymał się przepisanej techniki wypełniania mojego ViewModelu własnymi właściwościami dla każdego pola (jako FirstName poniżej), ostatecznie będę musiał napisać tonę dodatkowego kodu, aby otrzymać wywołanie NotifyOfProperyChange. Aplikacja będzie dość duża. Czy powinienem wystawiać każdy obiekt jako właściwość ViewModel?Wiązanie EF4 z Caliburn.Micro: Czy powinienem wystawić mój podmiot jako właściwość ViewModel?
In My 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; } }
moim zdaniem:
<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" />
góry dzięki.
To jest świetna informacja. Zwłaszcza konwencja CM interpretująca podkreślenie jako notację kropkową. Na pewno sprawdzę AutoMapper i książkę MVC. Jedno małe pytanie ... czy właściwości encji powinny zostać zaktualizowane w ustawieniach (do wartości), czy powinienem poczekać, aż kliknięty zostanie zapis i zaktualizować wszystkie naraz? Dzięki jeszcze raz. – DeveloperDan
Czy pytasz, kiedy należy przechowywać w bazie danych, kiedy wartość właściwości zmienia się, a użytkownik klika przycisk Zapisz? –
Nie, pozostanę przy save (zasada chunky not chatty). Pomyślałem, że jeśli nie ujawnię tego bytu, mógłbym poczekać, aż Save zaktualizuje wszystkie właściwości obiektu. Ale teraz, gdy o tym myślę, to nie ma sensu, ponieważ musiałbym zaktualizować wszystkie wartości, nawet gdyby tylko jedna została zmieniona. Tak, odpowiedziałem na własne pytanie - zachowam aktualizację własności/pola obiektu w ustawieniach. – DeveloperDan