Diskuze: WPF - problém se spuštěním validátoru po zobrazení okna/formuláře

C# .NET .NET (C# a Visual Basic) WPF - problém se spuštěním validátoru po zobrazení okna/formuláře American English version English version

Avatar
Honza
Člen
Avatar
Honza:

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. března 15:29
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Odpovídá na Honza
Michal Štěpánek:

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. března 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:

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. března 21:24
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Odpovídá na Honza
Michal Štěpánek:

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

Nahoru Odpovědět 9. března 22:30
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na Honza
ostrozan:

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  +1 10. března 5:23
Avatar
Honza
Člen
Avatar
Odpovídá na Michal Štěpánek
Honza:

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. března 10:02
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Odpovídá na Honza
Michal Štěpánek:

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í
+1 bodů
Řešení problému
Nahoru Odpovědět 10. března 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:

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. března 10:08
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Honza
Člen
Avatar
Odpovídá na Michal Štěpánek
Honza:

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. března 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.