ITnetwork Flashka zdarma C a C++ týden
Akce! Pouze tento týden sleva až 80 % na kurzy C++. Lze kombinovat s akcí 50 % bodů navíc na prémiový obsah!
Brno? Vypsali jsme pro vás nové termíny školení Základů programování a OOP v Brně!
Avatar
David Moškoř:4.9.2018 14:20

Ahoj. Začal jsem s jednou hrou a hned mám naprosto jednoduchou chybu, ale i přesto si s ní nemůžu poradit. Obsah labelu mám nastavený na Binding Score, avšak ukáže se pouze předdefinovaná hodnota skóre a když ji později v kódu změním text v labelu se již nezmění.

Zkusil jsem: Mám veřejnou třídu Settings a v ní mám veřejnou proměnnou Score:

public class Settings
    {

        public int Score { get; set; }

        public Settings()
        {
            Score = 150; //pro zkoušku jsem nastavil skóre ze začátku na 150
        }
    }

Do proměnné settings vytvořím instanci třídy Settings a DataContex nastavím na settings. Potom pro zkoušku každou sekundu zvýším skóre o jedno, avšak v labelu zůstane 150.

private Settings settings;

       public MainWindow()
       {
           InitializeComponent();
           settings = new Settings();
           DataContext = settings;
           DispatcherTimer gameTimer = new DispatcherTimer
           {
               Interval = TimeSpan.FromMilliseconds(1000 /*/ settings.Speed*/)
           };
           gameTimer.Tick += new EventHandler(UpdateScreen);
           gameTimer.Start();
       }

        private void UpdateScreen(object sender, EventArgs e)
        {
            settings.Score++;
        }

Chci docílit: Snažím se dosáhnout toho, aby byl label synchronizovaný s proměnnou Score.

Odpovědět 4.9.2018 14:20
Život je příliš krátký na to, abyste vymýšleli smysluplné názvy proměnných!
Avatar
David Moškoř:4.9.2018 14:37

Chybu jsem nakonec vyřešil. Stačilo implementovat INotifyProper­tyChanged, aby se obsah v labelu měnil. Jen nechápu proč se v tutoriálu na upomínač narozenin do ListBoxu přidávaly položky automaticky.

Editováno 4.9.2018 14:38
Akceptované řešení
+5 Zkušeností
Řešení problému
Nahoru Odpovědět  -1 4.9.2018 14:37
Život je příliš krátký na to, abyste vymýšleli smysluplné názvy proměnných!
Avatar
krepsy3
Redaktor
Avatar
Odpovídá na David Moškoř
krepsy3:4.9.2018 17:38

Protože ListBox byl nabindovaný na kolekci dat. Kolekce jako taková se nemění, když manipuluješ s jejími položkami. A protože se kolekce nemění, není potřeba při přidání položky volat PropertyChange­dEventHandler na kolekci, ani by to nemělo smysl.

Naopak byla použita kolekce, která hlídá vnitřní stav sama sebe a volá PropertyChange­dEventHandler pro své položky, ať už jsou editovány, přidávány či mazány. Tato kolekce se jmenuje ObservableCollec­tion<>, a kdybys četl tutoriál pořádně, zjistil bys všechny tyto informace, které jsem právě napsal, i informace o implementaci INotifyProper­tyChanged, které jsi zřejmě vyčetl jinde.

Editováno 4.9.2018 17:39
Nahoru Odpovědět  +3 4.9.2018 17:38
Programátor je stroj k převodu kávy na kód.
Avatar
Odpovídá na krepsy3
David Moškoř:5.9.2018 20:00

Děkuji za vyjasnění. Setkal jsem se s tímto problémem, takže jsem si jen přečetl článek, kde se psalo o bindingu a ano, nepřečetl jsem si jej pořádně. Tutoriál si tedy radši přečtu celý od prvního dílu do posledního dílu zdarma.

Nahoru Odpovědět  +1 5.9.2018 20:00
Život je příliš krátký na to, abyste vymýšleli smysluplné názvy proměnných!
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 4 zpráv z 4.