Diskuze: C# WPF Binding - nefunkční

C# .NET .NET (C# a Visual Basic) C# WPF Binding - nefunkční American English version English version

Avatar
krepsy3
Redaktor
Avatar
krepsy3:

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. července 17:45
Programátor je stroj k převodu kávy na kód.
Avatar
rwn
Člen
Avatar
Odpovídá na krepsy3
rwn:

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í
+1 bodů
Řešení problému
Nahoru Odpovědět 31. července 18:03
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
krepsy3
Redaktor
Avatar
krepsy3:

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. července 18:09
Programátor je stroj k převodu kávy na kód.
Avatar
rwn
Člen
Avatar
Odpovídá na krepsy3
rwn:

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. července 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.