Hej.
Postanowiłem złapać za WPFa z wykorzystaniem MVVM. Może opisze problem na swoim przykładzie.
Stworzyłem sobie solucję, a w niej trzy projekty (View, ViewModel, Model). View dostał referencję do ViewModel, a ViewModel do Modelu. Do projektu Model został dodany *.edmx z prostą bazą składającą się z jednej tabeli. Po dodaniu pięknie wygenerowała się klasa reprezentująca tabele i connectionString (poprawny). W widoku dodałem kontrolkę dataGrid żeby jakoś przedstawić te dane z tabeli. Do MainWindow zbindowałem pod DataContext swój ViewModel, a następnie pod dataGrid chciałem podpiąć swoją ObservableCollection z ViewModelu - niestety nie widać jej tam (dopiero po dodaniu referencji do modelu ona się pojawia czego chyba powinienem uniknąć bo widok nie powinien o nim wiedzieć[?]). Wydaje mi się, że jest to spowodowane przez to, że mój widok bez referencji do modelu nie zna typu tej kolekcji, która powiedzmy składa się z obiektów User. W tym miejscu pytanie - powinienem w części ViewModel stworzyć sobie jakąś klasę, która będzie reprezentować te dane z modelu w widoku tak żeby uniknąć referencji View->Model? Kolejne pytanie - gdzie powinny znaleźć się zapytania do bazy danych? Z tego co czytałem powinno to wszystko być w modelu tylko w jaki sposób to wszystko poprawnie okodzić? W tej chwili jest to dla mnie dość nieintuicyjne i całą logikę upchałbym w ViewModelu, który łączy się z bazą i z wykorzystaniem modelu pobiera sobie odpowiednie dane i dostosowuje je do widoku. Ostatnie pytanie - upychając wszystko w jednym projekcie udało mi się wyrzucić na kontrolkę informację z tabeli natomiast cały czas mam błąd (który pojawia się również, gdy solucja jest podzielona na 3 projekty): No connection string named "AccountsDBEntities" could be found in the application config file. Oczywiście wszystko jest na swoim miejscu:
App.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
**<connectionStrings>
<add name="AccountsDBEntities" connectionString="metadata=res://*/Database.csdl|res://*/Database.ssdl|res://*/Database.msl;provider=System.Data.SqlClient;provider connection string="data source=PCName\DBSERVER;initial catalog=AccountsDB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
</connectionStrings>**
</configuration>
Konstruktor w moim DBContext.cs:
public AccountsDBEntities()
: base("name=AccountsDBEntities")
{
}
Będę bardzo wdzięczny za rozjaśnienie mi tematu i ogólnie koncepcji MVVM najlepiej na jakimś przykładzie. Z góry dzięki za pomoc :) Jeżeli będzie trzeba wrzucę cały kod :)