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: WPF - problém se spuštěním validátoru po zobrazení okna/formuláře

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

Aktivity
Avatar
Honza
Člen
Avatar
Honza:9.3.2016 15:29

Ahoj, ve své aplikaci jsem si napsal vlastní validátor hodnot textboxu který funguje víceméně tak jak potřebuji, ale s jednou drobnou nepříjemností.

Jde o tohle, mám validátor který kontroluje zda je zadaná hodnota Int64 a zároveň není nula. Když ručně zadávám hodnoty, tak validátor reaguje přesně tak jak má. Pokud se mi ale při bindingu dosadí do textboxu nula, což je defaultní hodnota Int64, tak na to validátor nezareaguje. Když ji smažu a znovu vložím tak už to funguje. Problém bude tedy buď v tom, že binding dat proběhne dřív než nastavení validátoru, což mi je ale divné, protože data binduju až v události Window_Loaded a nebo při prvním bindingu textbox nevyhazuje událost PropertyChanged.

Zde je XAML:

<TextBox x:Name="txtMyNumber">
        <TextBox.Text>
                <Binding Path="MyNumber" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay">
                        <Binding.ValidationRules>
                                <c:ValidatorInt64 EmptyStringIsValid="False" ZeroIsValid="False"/>
                        </Binding.ValidationRules>
                </Binding>
        </TextBox.Text>
</TextBox>

zde je binding dat:

public Int64 MyNumber { get; set; }

private void Window_Loaded(object sender, RoutedEventArgs e)
 {
        txtMyNumber.DataContext = this;
}

Jak se tohle řeší? Musím nějakým způsobem po otevření okna poprvé validátor explicitně zavolat, nebo na to jdu z blbý strany? Jde mi čistě jen o validaci hned po zobrazení okna/formuláře, pak už vše funguje tak jak má.

Odpovědět
9.3.2016 15:29
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Odpovídá na Honza
Michal Štěpánek:9.3.2016 15:54

Nějak mi uniká smysl validace při otevření okna. Myslel jsem si, že hodnoty je třeba validovat při ukládání a ne při načítání, nebo proč ta validace tam je?

Nahoru Odpovědět
9.3.2016 15:54
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Honza
Člen
Avatar
Honza:9.3.2016 21:24

Jde o to, že zobrazím okno s textboxem do kterého je potřeba zadat číslo (ono tam toho je samozřejmě víc, tohle je jen pro zjednodušení). V textboxu musí být číslo různé od nuly. A validace tam je kvůli tomu, že ve chvíli kdy tam je zadaný nevalidní text, tak se textbox červeně podbarví a zakáže se tlačítko "Uložit". No a problém je v tom že to je nabindované na Int64 který má jako defaultní hodnotu 0. V praxi to tedy vypadá tak, že se otevře okno s textboxem ve kterém je hodnota 0, ale vzhledem k tomu že neproběhla validace, tak to uživatel může uložit (není zakázané tlačítko Uložit ani podbarvaný textbox). Vím že bych to mohl ošetřit např. tak, že bych mohl defaultně zakázat to tlačítko na ukládání, ale to mi nepříjde moc pěkný a navíc by mě zajímalo proč se to takhle chová.

Nahoru Odpovědět
9.3.2016 21:24
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Odpovídá na Honza
Michal Štěpánek:9.3.2016 22:30

A není jednodušší místo textboxu použít NumericUpDown?

Nahoru Odpovědět
9.3.2016 22:30
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Honza
ostrozan:10.3.2016 5:23

Validace je vázaná na akci - u tebe na TextInput, takže zkus ve Window_loaded dát za datacontext

txtMynumber.Text = "0";
 
Nahoru Odpovědět
10.3.2016 5:23
Avatar
Honza
Člen
Avatar
Odpovídá na Michal Štěpánek
Honza:10.3.2016 10:02

Ono se nejedná jen o čísla a částky, těch validací tam je hromada, např. rodná čísla, emaily, telefonní čísla + nějaké interní speciální označení které musejí odpovídat specifickému formátu atd. Ten příklad s číslem byl jen pro ilustraci.

Nahoru Odpovědět
10.3.2016 10:02
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Odpovídá na Honza
Michal Štěpánek:10.3.2016 10:04

Aha... A když ti ta validace funguje při tučním zadávání, nestačilo by tu validaci spustit na událost stisku tlačítka (v podstatě jakoby kontrola před uložením)?

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
10.3.2016 10:04
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Honza
Člen
Avatar
Odpovídá na ostrozan
Honza:10.3.2016 10:08

Díky, tohle funguje :) Ale stejně by mě zajímalo jestli nejde nějak docílit toho, aby se ten validátor zavolal automaticky po bindingu.

Nahoru Odpovědět
10.3.2016 10:08
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Honza
Člen
Avatar
Odpovídá na Michal Štěpánek
Honza:10.3.2016 10:13

To by asi stačilo díky :)
Problém byl v tom že jsem nemohl přijít na to jak tu validaci spustit ručně, resp. moc to nefungovalo.

Funguje je mi když to zavolám takhle:

txtMyNumber.GetBindingExpression(TextBox.TextProperty).UpdateSource();
Nahoru Odpovědět
10.3.2016 10:13
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
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 9 zpráv z 9.