Avatar
Petr Nymsa
Redaktor
Avatar
Petr Nymsa:

Ahoj,
občas si lámu s touhle otázkou nepěkné chvíle. Vždycky se zamýšlím, jestli je nutné např modely popisující jednoduché data a ve většině případů se jedná o entity pro databázi (EF, SQLite, LINQ) oddělovat od ViewModelu.

Mějme model Person

public class Person
 {
     public int ID { get; set; }
     public int Age { get; set; }
     public string Name { get; set; }

 }

Vynechme případně konstruktor a atributy. Samozřejmě osobu budu chtít i prezentovat ve View. Tudíž si vytvořím ViewModel. Třída dědí mnou napsanou bázovou třídu (abstraktní) ViewModelBase. Pro jednoduchost, obsahuje implementaci INotifyProper­tyChanged a některou další logiku pro ViewModely.

public class PersonViewModel : ViewModelBase<Person>
   {
       private int _id;

       public int ID
       {
           get { return _id; }
           set { Set(ref _id, value); }
       }

       private int _age;

       public int Age
       {
           get { return _age; }
           set { Set(ref _age, value); }
       }

       private string _name;

       public string Name
       {
           get { return _name; }
           set { Set(ref _name, value); }
       }


       /// <summary>
       /// ViewModelBase implements T property with given model
       /// </summary>
       /// <param name="person"></param>
       public PersonViewModel(Person person)
           :base(person)
       {
           this.ID = person.ID;
           this.Age = person.Age;
           this.Name = person.Name;
       }
       public override void Refresh()
       {
           throw new NotImplementedException();
       }
   }

A finální otázka teda zní, je to nějaké zásadní porušení MVVM, když bych tyto 2 třídy sloučil do jedné? Doteď to občas používám a nepřijde mi to tak hrozné.
Jiná situace je, jakmile do ViewModelu začnu implementovat Commandy apod. Mě spíše jde opravdu o tyto jednoduché entity a co s nimi.

Díky za diskuzi! :)

Odpovědět 20.8.2015 20:58
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Petr Nymsa
Jan Vargovský:

Porušení MVVM to z mého pohledu je. Vždycky bys měl mít nezávislé modely a pak specifický viewmodel a k tomu napasovaný view. Ono jestli tam nemáš žádnou složitou business logiku, tak to nejde tak vidět, ale pak budeš rád, že máš prázdné modely a logiku ve viewmodelu. Jestli tě sere to dlouhé opisování všech vlastností, tak tomu se můžeš z části vyhnout použitím AutoMapperu (najdeš na nugetu).

 
Nahoru Odpovědět 20.8.2015 21:08
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Jan Vargovský
Petr Nymsa:

Máš pravdu, nad AutoMapperem jsem se zamýšlel sám, ale do ted mě nenapadlo ho hledat :D

Ještě jedna věc, ale trochu OT. Viz http://pastebin.com/BhzvBKuy.
Mám takovou klasicky napsanou ViewModelBase s metodu pro Setter. Napadlo mě "vylepšení" jak udělat, aby ViewModely měli jen Property, tj zkrácený zápis. Co myslíš?

Nahoru Odpovědět 20.8.2015 21:39
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Petr Nymsa
Redaktor
Avatar
Petr Nymsa:

Ještě je dobrý dodat, že to bylo spíše pro zvědavost, jestli to tak bude fungovat než, že bych uvažoval na nasazením, protože šetřím tím jeden řádek vždycky a hlavně ve VS mám snippety. Jen kdyby tohle někdo našel a zaujalo ho to :)

Nahoru Odpovědět 20.8.2015 21:46
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Petr Nymsa
Jan Vargovský:

Já do WPF nějak moc nepronikl, než jsem se k němu dokopal, tak jsem přešel do korporátní sféry a k WPF jsem se už nějak nedostal :D ve výsledku mi to přijde daleko komplexnější a u propert by ses napsal ještě více s tím, že nevím jaké výhody/nevýhody bys dostal, že si přepisuješ referenci.

Editováno 20.8.2015 22:01
 
Nahoru Odpovědět 20.8.2015 22:01
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.