NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: C# WPF Binding - nefunkční

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
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.