DataBinding vs. VisualStudio 2010 – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

DataBinding vs. VisualStudio 2010 – .NET – Fórum – Programujte.comDataBinding vs. VisualStudio 2010 – .NET – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
VladislavK0
Super člen
21. 9. 2012   #1
-
0
-

Ahoj všem

Mam takový divný dotaz.

A toto je dost přesná definice, než abych tady psal nějaký nesmyslný dotaz tak by to raději po Skype vysvětlil.

Prosím o kontakt na "vladislav.kral", já ten znalostní zisk následně popíšu sem do fora - možná článek.

Díky všem ochotným

Nahlásit jako SPAM
IP: 89.24.51.–
Manželka programátora pošle svého muže koupit chleba s dovětkem kdyby měly housky přines jich deset! Co přinese programátor??
Evzen+2
Návštěvník
22. 9. 2012   #2
-
0
-

Mluvime o WPF/Silverlight technologii?

Evzen

Nahlásit jako SPAM
IP: 109.80.214.–
VladislavK0
Super člen
22. 9. 2012   #3
-
0
-

Spíše o WPF ale nakonec ten problém bude mít stejného jmenovatele.

Jde o to ze mi properties a vizard  NENABIZí proměně které bych mohl naklikat do XAML během tvorby obrazovky.

 A toto končí tím že překlad proběhne OK tak program vyhučí na chybu v neznamém jméně typicky "class.Status" a "class.status".

A to je to co mě úplně neskutečně ser... protože dohledáváni správného tvaru jména té property mi přijde strašně kontraproduktivní.

Nejspíš dělám chybu já ale taky je možne že mám někde něco špatně nastavené ve VS.

Tak o to je ten problem

Nahlásit jako SPAM
IP: 89.24.12.–
Manželka programátora pošle svého muže koupit chleba s dovětkem kdyby měly housky přines jich deset! Co přinese programátor??
Evzen+2
Návštěvník
24. 9. 2012   #4
-
0
-

Ahoj,

jestli tomu spravne rozumim, tak mas problem zejmena s designerem..

Pokud pouzivas nektere pokrocilejsi techniky, tak doporucuju designer uplne vynechat popr. pouzivat ho jen velice ramcove. Osobne mi prijde prace v x(a)mlu daleko rychlejsi nez-li pretahavani a nastavovani vlastnosti pomoci designeru. Navic se ti negeneruji zbytecne parametry, ktere nepotrebujes, ci ponechavas je v defaultnim nastaveni. 

Designer taky vetsinou sazi prvky GUI fixne, tedy pozice X, Y, vyska, sirka + margin. 

V praxi ale vetsinou vyuzivame layouty (http://www.wpftutorial.net/Layout.html).

Po pravde receno, wpf ma tak propracovany system bindingu, ze vyuzivat udalosti ala WinForms mi prijde skoda.

Napr. pokud mas ve WPF jednoduchy datagrid, textBox a tlacitko a chces pomoci tlacitka pridavat text do gridu, tak muzes vyuzit bud standardni udalostni model tzn:

  • napr. v udalosti Loaded si nactes zdroj dat ItemsSource (napr. xml, db ci jinak)
  • double klikem vytvoris udalost onClick nad tlacitkem
  • do OnClick udalosti zapises sebrani hodnoty z textBoxu, pridani do ItemsSource
  • dale musis vytahnout View a refreshnout, aby se ti to vubec zobrazilo

Toto vypada relativne jednoduse, ale prijde zakaznik (ktery je vzdycky nespokojeny), umane si, ze misto gridu chce listView, misto textBoxu chce comboBox a pro tebe to bude znamenat rozkopat pulku jak GUI (cemuz se nevyhneme nikdy), tak ale i pulku vykonnyho kodu. Udalosti jsou zkratka prilis vazany na konkretni prvky GUI.

WPF ale nabizi novy a po zvladnuti daleko prijemnejsi model propojovani dat.

V dnesni dobe se ruzny odnoze MVC vyuzivaji vsude. I WPF ma svoji odnoz nazyvajici se MVVM neboli

Model-View-ViewModel

Spravne by to asi melo spis byt Model-ViewModel-View, protoze ten dulezity prvek je ViewModel, ktery reprezentuje ten "klin" mezi daty a GUI.

Vysledek je vlastne ten, ze nepises udalosti pro konkretni prvky, ale pises obecne nejakou akci, a na GUI zadas, kterou akci ma tlacitko spustit. To jestli akce je implementovana ci neni, o tom GUI nevi naprosto nic, analogicky ani ViewModel nevi, jestli data, ktery pozmenil View zobrazuje ci ne.

Komunikace View-> ViewModel jde celkem bez problemu, vyuzivaji se tzn. Commandy, ktere se z GUI vyvolavaji. Horsi je ale komunikace z ViewModelu na View. 

Pokud napr. pomoci tlacitka pridas nejaky prvek, tak i pres udalosti musis obnovit datagrid, aby se ti data zobrazily.

U MVVM to funguje trocha jinak. ViewModel musi implementovat rozhrani INotifyPropertyChanged a pri zmene jakyhokoliv prvku odpali udalost o tom, ze se zmenila vlastnost se jmenem XXX. Na to reaguje View.

Z pocatku se toto zda jako slozite, ale je to velice elegantni a zrovna mne uz se to nekolikrat osvedcilo, protoze zakaznik meni nazor ze dne na den a tam, kde jeden den byl checkBox je druhy den comboBox a treti den opet checkBox.

Pokud te to aspon trochu zaujalo, doporucuju tyto stranky:

http://msdn.microsoft.com/…d419663.aspx

http://xaml.cz/…za-krokem-1/

Evzen

Nahlásit jako SPAM
IP: 193.179.183.–
VladislavK0
Super člen
24. 9. 2012   #5
-
0
-

Diky

Takze to podle vseho vypada, ze ten DataBinding pouzivam nespravne.

Ano chyba bude na me strane nikoly na strane VS

kazdopadne diky

Nahlásit jako SPAM
IP: 89.24.49.–
Manželka programátora pošle svého muže koupit chleba s dovětkem kdyby měly housky přines jich deset! Co přinese programátor??
JardaJirava0
Stálý člen
24. 9. 2012   #6
-
0
-

Ahoj,

také si nejsem jist, zda jsem dotaz pochopil správně a když už jsi se neozval na odpověď přes kontaktní formulář, tak zkusím odpovědět tady.

Netuším, zda se jedná o chybu bindování tvých vlastností na vlastnosti uživatelských prvků nebo o problém se špatně zapsanými vlastnostmi u uživatelských prvků.

XAML je case sensitive (tak jako je case sensitive c# nebo xml), takže je skutečně rozdíl, jestli napíšeš class.Status nebo class.status. Na chyby v samotném Bindingu, tedy v použití chybného názvu vlasnosti pro binding u markup extension Binding, tě informuje kompiler v okně Output (teď si nejsem jist, zda je to by default zapnuto, každopádně je možné si tento výstup zapnout).

V případě chybně zapsaných vlasností by tě pak měl informovat a vyhodit chybu rovnou compiler, až tuším na případy, kdy se jedná o template a Setter hodnoty - možná jen v resource souborech. Kdy k jejich kompilaci dochází až v okamžiku použití.

Zkus lépe specifikovat, kde je ten problém, pak se dá poradit účelněji.

Pěkný den,

Nahlásit jako SPAM
IP: 213.192.30.–
MCAD, MCPD
http://jirava.net/blog
http://xaml.cz - Magazín moderních technologií založených na XAML
VladislavK0
Super člen
27. 9. 2012   #7
-
0
-

Tak jsem se rozhodl že toto vlákno znova otevřu a to ze dvou důvodů.

1) Myslím si, že zde popisovaný problém dost koresponduje s o něco mladším vláknem http://programujte.com/forum/vlakno/22011-c-winform-programovani/

2) Ještě stále z tohoto problému nejsem moudrej, jinými slovy já bych chtěl ten vizárd ve WPF používat minimálně proto abych viděl jaké property komponent na UI se mají naplnit a jakou hodnotou. viz tento příspěvěk http://programujte.com/forum/vlakno/22011-c-winform-programovani/#p163810

Tak tedy k věci. Předem ještě info že celý projekt je tutorial z tohoto linku. http://programujte.com/clanek/2008012701-wpf-adresar-1-dil/. Jak jsem uvedl jde mi o WPF wizard, který se v mém VS2010 chová následovně.

Jde o to že mi vizárd nenabízí žádnou množinu vlastností, proměnných atd., které bych chtěl nabindovat do vlastností prvků na obrazovce. Zpravidla k tomuto dochází, když například třídu, která tyto prvky obsahuje jsem vytvořil někdy dříve (před měsícem) a díky tomu zapomněl jak se ta vlastnost přesně jmenuje. Tím dochází k situaci že přeskakuji z okna do okna a technikou copy-paste doplňuji patřičná jména do patřičných vlastností komponenty.

Poznámka: To že XAML je CaseSensitive to vím a protože mnohdy jsou názvy těch promněných dost složite (mnohopísmenkové) pak dochází k tomu o čem píšu.

"PersonalName" je properta, kterou jsem si doplnil do třídy Kontakty a stejně jako tuto, tak i ostatní property z uvedené třídy nejsou vidět. viz bublinka could not be resolved. Nic méně program v uvedeném listu normálně celý seznam zobrazí a jsou funkční i patřičné prokliky.

Není chybou programátora když na stejné místo zapíše "personalName" i u takto zapsaného názvu se objeví bublinka could not be resolved. Ale program z principu přestane fungovat, logicky je seznam prázdný a logicky přestanou fungovat prokliky. Vím že mi to do Outputu vypíše Exception viz druhý obrázek.

Té exception samozřejmě rozumím ale protože třída "kontakty" je ze stejného projektu a současně ze stejné Namespace viz výše uvedený tutorial, tak se ptám proč mi ten Vizard ty prvky nenabízí, přesněji řečeno co musím udělat proto aby vizard ten seznam prvku viděl.

A zajímalo by mne jak by to dopadlo kdyby Kontakty byla entita EF z databaze umístěná v jiném projektu a v jine namespace. 

Snad jsem to popsal dost srozumiteně.

Nahlásit jako SPAM
IP: 89.24.8.–
Manželka programátora pošle svého muže koupit chleba s dovětkem kdyby měly housky přines jich deset! Co přinese programátor??
JardaJirava0
Stálý člen
27. 9. 2012   #8
-
0
-

Ahoj,

pokusím se odpovědět, byť je mi jasné, že tě nejspíše neuspokojím se svým výkladem a vyjádřením.

O co se zřejmě pokoušíš je, dostat do Bindingu něco jako Intelisense. Teď je otázka, na co by ta Intelisense měla být resolvována. Uvádíš krásný přiklad s Template. Tento template můžeš použít relativně všude a nikde není specifikováno, jaký objekt (třída) bude ve výsledku přiřazen a použit pro zobrazení dat.

Přihlédněme ještě k tomu, že DataContext je typu object, tudíž neví nic o tom, co ve výsledku do dané vlastnosti vlastně přijde. Vše ještě komplikují další vlastnosti Bindingu a to je ElementName stejně tak jako Source a RelativeSource.

V takovém případě asi není úplně snadné rozpoznat správný typ a spoléhá se na runtime resolving dané vlastnosti.

Jistým způsobem ti může pomoci použití nástroje Expression Blend, kde si pomocí wizarda můžeš ten Binding.Path naklikat.

Osobně se však kloním k tomu, že ViewModel by měl být jasný a vcelku malý a tak není problém si těch několik vlastností zapamatovat nebo si vytáhnout Class view okno a z něj ty názvy přepsat.

Pěkný den,

Nahlásit jako SPAM
IP: 77.78.85.–
MCAD, MCPD
http://jirava.net/blog
http://xaml.cz - Magazín moderních technologií založených na XAML
m4r100
Návštěvník
28. 9. 2012   #9
-
0
-

#4 Evzen
Ukazu maly priklad jak se ten interface INotifyPropertyChanged pouziva, mozna to nekomu bude napomocne.

Prvni trida, definujete data, ktere budete napr. nacitat. V prikladu nacitam data z csv(Excel) souboru, sloupec "Name" a "Money".

public class Finance : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private string name;
        public string Name
        {
            get { return name; }
            set 
            { 
                name = value;
                this.NotifyPropertyChanged("Name");
            }
        }

        private decimal money;
        public decimal Money
        {
            get { return money; }
            set 
            { 
                money = value;
                this.NotifyPropertyChanged("Money");
            }
        }



        private void NotifyPropertyChanged(string prop)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(prop));
        }
    }

Na prvni pohled to muze vypadat komplikovane, ale neni tomu tak. Staci si jenom zapamatovat.

Pouzit interface INotifyPropertyChanged.

Deklarovat event PropertyChangedEventHandler PropertyChanged.

Napsat a zjistit jak se pouzivam metoda void NotifyPropertyChanged(string prop). To je vsechno.

Pak uz jenom nekde v kodu napisete:

BindingList<Finance> data = new BindingList<Finance>(); // Vytvoreni

data.Add(new Finance() { Name = "First", Money = 100 }); // Pridani polozky

listBox1.DataSource = data; // Prirazeni BindingListu k listBoxu nebo necemu jinemu. Automaticka aktualizace.

Je to jednoduche a ucinne.

Nahlásit jako SPAM
IP: 80.82.147.–
Řešení
JardaJirava0
Stálý člen
28. 9. 2012   #10
-
0
-
Vyřešeno Nejlepší odpověď

Ahoj,

  obávám se, že tazateli šlo právě o tu poslední část, kterou jsi nenastínil a to samotný binding, který je zapsán "textově" a nemá tak žádnou kontrolu ani nápovědu, ať už při psaní kódu nebo při kompilaci a případný překlep nebo nesprávně zapsaná vlastnost je detekována až v okamžiku běhu programu.

  A vůbec si nejsem jist, jestli bude možné provést tuto kontrolu v nejbližší době. Nejspíše by to pak chtělo něco obdobného, s čím přišli v asp.net 4.5 a to jsou typové serverové prvky.

  Pěkný den,

Nahlásit jako SPAM
IP: 213.192.30.–
MCAD, MCPD
http://jirava.net/blog
http://xaml.cz - Magazín moderních technologií založených na XAML
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 30 hostů

Podobná vlákna

DataBinding v C# (C++) — založil paashi

Silverlight - dataBinding — založil Petrroll

Silverlight a databinding — založil Chrasty

MS Blend a VisualStudio — založil Jirka

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý