Problém s DataBindingem

Vše okolo vývoje aplikací pro platformy Windows Phone a Windows 10 Mobile
Odpovědět
Petrroll
přispěvatel
přispěvatel
Příspěvky: 92
Registrován: sob bře 06, 2010 15:24
Zařízení: Samsung galaxy S

Problém s DataBindingem

Příspěvek od Petrroll »

Zdravím, po delší době jsem se dostal shodou náhod k programování a mám drobnej problém s DataBindingem. Snažím se jet podle MVVM, takže mám klasicky model, ViewModel a data láduju DataBindingem.

Kód stránky, přiřadím DataContext

Kód: Vybrat vše

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);

            string s_id = null;
            NavigationContext.QueryString.TryGetValue("id", out s_id);
            var viewMod = new T1ViewModel();
            DataContext = viewMod;
            viewMod.ID = int.Parse(s_id);
        }
ViewModel:

Kód: Vybrat vše

    class TeacherViewModel : ViewModelBase
    {
        private T1 T1 { get; set; }
        public int ID { set { Teacher = App.ViewModel.T1[value]; RaisePropertyChanged("T1"); } }  //Do proměnný načtu podle IDčka danej objekt
    }
A samotnej XAML:

Kód: Vybrat vše

StackPanel DataContext="{Binding T1}" ...>
            <TextBlock ... Text="{Binding NM}"  .../>
A (ne)překvapivě to nefunguje. V StackPanelu se totiž neaktualizuje DataContext a tudíž následně ani v TextBlocku. Vím, že někde určitě dělám naprosto fundamentální chybu, ale už jsem delší dobu neprogramoval a prostě jsem z toho vypad'.
Martin Suchan
smartmaniak
smartmaniak
Příspěvky: 1138
Registrován: pát bře 11, 2011 10:48
Zařízení: Nokia Lumia 925
Bydliště: Praha

Problém s DataBindingem

Příspěvek od Martin Suchan »

Jestli to neni tim, ze ten Teacher je private?
Jinak ViewModel bys nemel vytvaret v OnNavigatedTo ale v samotnem MainViewModelu v metode, ktera resi navigaci na stranku s ucitelem, a na strance se na nej uz jen odkazovat na neco jako MainViewModel.CurrentTeacher. Tim by ses vyhnul pouziti QueryStringu, parsovani IDcka, vytvareni noveho viewmodelu v OnNavigatedTo (muze zabrat dost casu u velkych modelu a zablokujes tim UI thread).
Stejne tak mit vse staticky v App neni idealni, radeji pouzit DependencyInjection nebo ViewModelLocator.
Petrroll
přispěvatel
přispěvatel
Příspěvky: 92
Registrován: sob bře 06, 2010 15:24
Zařízení: Samsung galaxy S

Problém s DataBindingem

Příspěvek od Petrroll »

Privátní Teacher je jen pozůstatek testování, nefunguje to samozřejmě ani s veřejným.

Na ty změny se podívám, nicméně to jsou (vcelku) drobnosti, které by fungování neměli nikterak výrazně ovlivnit. Přeci jen i tak bych DataContext přiřazoval až v OnNavigatedTo, jen už předem vytvořený.
Igor Kulman
častý přispěvatel
častý přispěvatel
Příspěvky: 228
Registrován: stř bře 28, 2012 12:46
Zařízení: ano

Problém s DataBindingem

Příspěvek od Igor Kulman »

Podľa mňa je to tým, že tvoj setter pre Teacher nevolá RaisePropertyChanged. Takže ti priradíš stránke DataContext, v ktorom je Teacher null, potom priradíš id, ktoré priradí Teacher ale stránka sa o tom už nedozvie. Prípadne ešte môžeš prehodiť riadky s DataContext = viewMod; a viewMod.ID = int.Parse(s_id);
Petrroll
přispěvatel
přispěvatel
Příspěvky: 92
Registrován: sob bře 06, 2010 15:24
Zařízení: Samsung galaxy S

Problém s DataBindingem

Příspěvek od Petrroll »

Ale při přiřazení ID a tedy v podstatě i Teacher přeci RaisePropertyChanged volám, takže ViewModel o změně (nebo krátce po ní) vědět dá. Prohazovat jsem zkoušel všechno možné.

//Původně jsem to měl elegantněji:

Kód: Vybrat vše

var viewMod = new TeacherViewModel() {ID = int.Parse(s_id)};
Igor Kulman
častý přispěvatel
častý přispěvatel
Příspěvky: 228
Registrován: stř bře 28, 2012 12:46
Zařízení: ano

Problém s DataBindingem

Příspěvek od Igor Kulman »

Uploadni niekde cely projekt... mi to vrta v hlave.
Petrroll
přispěvatel
přispěvatel
Příspěvky: 92
Registrován: sob bře 06, 2010 15:24
Zařízení: Samsung galaxy S

Problém s DataBindingem

Příspěvek od Petrroll »

Je to postavený na šabloně (sám bych ji nevybral, ale je to takovej 'úkol' pro známého*), proto taky takhle zmršeně zpracovanej ViewModel.

Konkrétně jde o page TeacherPage a příslušnej ViewModel.

*** (odkaz sundán na přání 'známého')

*) Potřebuje jako úkol udělat aplikaci a aby si to ulehčil, tak to chce mít na tejhle template. Já mu na tom jen měl ukázat jak to rozšířit + jak parsovat z HTML nějaký info.
Igor Kulman
častý přispěvatel
častý přispěvatel
Příspěvky: 228
Registrován: stř bře 28, 2012 12:46
Zařízení: ano

Problém s DataBindingem

Příspěvek od Igor Kulman »

Každý ViewModel musí byť public. Pridaj slovo public do TeacherViewModel a začne to fungovať. Inak pekný humus.
Petrroll
přispěvatel
přispěvatel
Příspěvky: 92
Registrován: sob bře 06, 2010 15:24
Zařízení: Samsung galaxy S

Problém s DataBindingem

Příspěvek od Petrroll »

Já sem blb, taková neuvěřitelně hloupá chyba.

//ohledně humusovosti, souhlasím, že je to docela maglajz, ale to je bohužel dílo autorů šablony.

PS: Díky moc!
Odpovědět

Zpět na „Programování a vývoj“

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 69 hostů