Vánoční nadílka Vánoční nadílka
Vánoční akce! Daruj lepší budoucnost blízkým nebo sobě. Až +50 % zdarma na dárkové poukazy. Více informací
Avatar
David Moškoř:4. září 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. září 14:20
Život je příliš krátký na to, abyste vymýšleli smysluplné názvy proměnných!
Avatar
David Moškoř:4. září 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. září 14:38
Akceptované řešení
+5 Zkušeností
Řešení problému
Nahoru Odpovědět  -1 4. září 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. září 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. září 17:39
Nahoru Odpovědět  +3 4. září 17:38
Programátor je stroj k převodu kávy na kód.
Avatar
Odpovídá na krepsy3
David Moškoř:5. září 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. září 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.