Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
krepsy3
Tvůrce
Avatar
krepsy3:31.7.2016 17:45

Ahoj, nefunguje mi binding, konkrétně binduju vlastnosti "Vyhry" a "Prohry" instance moderator do dvou textblocků v hlavním okně.

XAML:

<TextBlock x:Name="vyhryTextBlock" Text="{Binding Vyhry, Mode=OneWay}" Margin="0,10" />
<TextBlock x:Name="prohryTextBlock" Text="{Binding Prohry, Mode=OneWay}" Margin="0,10" />

CodeBehind:

private Moderator moderator;

public MainWindow()
{
    InitializeComponent();
    moderator = new Moderator(this);
    DataContext = moderator;
}

A třída Moderator:

public ulong Vyhry { get; private set ; }
public ulong Prohry { get; private set; }

Na hlavním okně mám tlačítko sloužící pro reset těchto statistik. Po zmáčknutí se to opravdu stane (ověřeno přes konzoli), ale TextBlocky jsou stále zamrzlé na původních hodnotách, jako by byl binding v režimu OneTime, což ale není. Jo, původní hodnoty obou textblocků se korektně nabindují při kostrukci objektu hlavního okna - v konstruktoru moderátora jsem nastavil, aby se vlastnosti nastavily na 10 (za účelem testování), a tyto desítky se skutečně zobrazí.

Neví někdo co s tím?

Odpovědět
31.7.2016 17:45
Programátor je stroj k převodu kávy na kód.
Avatar
rawen
Člen
Avatar
Odpovídá na krepsy3
rawen:31.7.2016 18:03

Musíš si implementovat interface INotifyProper­tyChanged, ten bude vytvářet událost změny vlastnosti a "kontrolka" se dozví, že došlo ke změně hodnoty na vlastnosti. Takže by to mohlo vypadat třeba takto:

public class Moderator : INotifyPropertyChanged
{
    private ulong vyhry;
    public ulong Vyhry
    {
        get
        {
            return vyhry;
        }
        set
        {
            vyhry = value;
            NotifyPropertyChanged("Vyhry");
        }
    }


    public event PropertyChangedEventHandler PropertyChanged;

    protected void NotifyPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;

        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
31.7.2016 18:03
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
krepsy3
Tvůrce
Avatar
krepsy3:31.7.2016 18:09

Děkuji! Teď bych ještě prosil vysvětlení - proč je updatovací metoda protected (jinými slovy - kde se dědí)?

Nahoru Odpovědět
31.7.2016 18:09
Programátor je stroj k převodu kávy na kód.
Avatar
rawen
Člen
Avatar
Odpovídá na krepsy3
rawen:31.7.2016 19:14

Aha, to jsem si ani nevšiml. Samozřejmě to nemusí být protected, ale klidně private. Vzal jsem to z nějakého programu co jsem dělal a tam jsem to tak měl a nevšiml jsem si toho, když jsem to sem vkládal. :D
A jen tak btw. sice nevím jaký tam s tím máš záměr, ale není zrovna dobré si předávat celý MainWindow do nějaké jiné třídy..

Nahoru Odpovědět
31.7.2016 19:14
Co můžeš naprogramovat dnes, neodkládej na zítřek.
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.