NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Honza
Člen
Avatar
Honza:1.9.2016 14:12

Ahoj, narazil jsem na jednu věc ohledně přístupu k původní hodnotě property a zajímalo by mě jak to řešíte v praxi.

Tedy, ve své WPF aplikaci používám obousměrný binding. Skvělá věc, šetří mi spoustu času a řádků kódu, jediné co musím udělat je vložit daný objekt do DataContext. Dejme tomu že mám třídu která drží data plateb a formulář který data zobrazí.

Třída reprezentující platbu má dvě vlastnosti: částka a datum přijetí. A dvě metody, jednu pro načtení dat z databáze a druhou pro uložení změněn do databáze.

Ve formuláři je oboustranný binding do textboxu a datepickeru. Pokud něco uživatel změní, automaticky se změní i property v datové třídě reprezentující platbu. Jsou na to navázány validátory atd.

A teď můj teoretický problém: pokud uživatel změnu uloží do databáze, je vše ok. Co když ale něco změní, pak si to rozmyslí a zavře formulář bez uložení? Díky bindingu a tomu že to je v DataContextu uložené jako reference je platba změněná napříč aplikací a tedy data neodpovídají tomu co je v databázi. Jak tomu zabránit?

Napadlo mě několik řešení, ale ani jedno mi nepříjde čisté

  • po zavření formuláře vždy znovu načíst data u plateb, které byly zobrazené - tohle řešení se mi nelíbí kvůli tomu, že se bude zbytečně volat databáze a to i v případě kdy uživatel nic nezmění a nebo změní třeba jen jednu platbu ze sta
  • místo reference předávat kopii instance třídy - nepředávat referenci ale vytvoři kopii objektu a tu předávat - to se mi moc nelíbí z důvodu zbytečného vytváření objektů a stejně bych pak asi musel původní data refreshnout
  • různé proměnné pro getter a setter - mohl bych vytvořit pro každý getter a setter samostatné proměnné. V getteru by byly vždycky data načtená z databáze nebo vložená při zavolání metody save. V setteru bych si tedy mohl nastavovat co bych chtěl, ale dokud bych to neuložil, getter bude vracet původní hodnotu - tohle řešení by se mi asi i líbilo, ale mám strach že při větším množství vlastností ve třídě to bude dost nepřehledné
  • vytvořit příznak unsavedData - nebo bych mohl vytvořit bool vlastnost která by mi říkala zda jsou ve třídě data neuložená do databáze. Ale stejně kdybych chtěl získat původní hodnotu, musel bych data znovu z databáze načíst. Je to v podstatě stejné jako v první odrážce, jen s tím rozdílem že bych nemusel načítat všechno, ale refreshnul bych jen to co má příznak "unsaved"

Osobně se mi nejvíc zamlouvá asi způsob u třetí odrážky, ale nejsem si jistý.

Jak by jste to řešili vy? Předem díky za reakce.

Editováno 1.9.2016 14:13
Odpovědět
1.9.2016 14:12
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Marian Benčat:1.9.2016 15:03

Vetsinou mas oddeleni ViewModel a model.. Takže ViewModel je to co odpovídá Viewčku,, ale do Modelu se to propíše až při uložení. Stejně tak se při otevření okna načtou hodnoty z MOdelu (nasetují se do ViewModelu).

Nahoru Odpovědět
1.9.2016 15:03
Totalitní admini..
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 2 zpráv z 2.