Save Button & UpdateSourceTrigger

Un paio di mesi fa ho iniziato a studiare WPF e devo dire che ogni giorno che ci passo sopra mi affascina sempre di più…La settimana scorsa mi sono imbattuto in un problema che inizialmente non sapevo proprio come risolvere: volevo che ad alcuni TextBox di una mia window fosse applicato il binding solo al Click del pulsante Save della finestra. Cosi mi sono messo a sfogliare Pro WPF in C# 2008 ed ho trovato quasi subito la soluzione: basta impostare la proprietà UpdateSourceTrigger del binding ad Explicit e poi nel Click handler del pulsante Save chiamare il metodo SourceUpdate della classe BindingExpression…

<!-- Nome -->
        <StackPanel Orientation="Vertical" Grid.Row="1" Margin="5">
            <TextBlock Text="Nome:" HorizontalAlignment="Left" FontWeight="Bold"/>
            <TextBox Name="nameTxt" HorizontalAlignment="Left" Width="170">
                <TextBox.Text>
                    <Binding Path="Name" UpdateSourceTrigger="Explicit">
                        <Binding.ValidationRules>
                            <local:RequiredValidationRule/>
                        </Binding.ValidationRules>
                    </Binding>
                </TextBox.Text>
            </TextBox>
        </StackPanel>
 
. . .
 
private void saveBtn_Click(object sender, RoutedEventArgs e)
        {
            if (!Utilities.IsValid(this))
                return;
 
            // apply binding
            nameTxt.GetBindingExpression(TextBox.TextProperty).UpdateSource();
            .
            .
            .
 
            this.DialogResult = true;
            this.Close();
        }
 
 

L’altro problema che mi sono trovato ad affrontare è di chiudere la finestra solo se tutte le ValidationRules sono state validate correttamente. Googlando un pò ho trovato la soluzione in questo post, dove presentano un metodo IsValid che a partire dal DependencyObject passato, valida sia le ValidationRules dell’oggetto stesso sia quelle dei Children eventualmente presenti. Quindi prima di chiudere la finestra chiamo il metodo IsValid passandogli come DependencyObject l’istanza della window…

if (!Utilities.IsValid(this))
    return;

…nel caso sia andato tutto a buon fine applico i binding e chiudo.

posted @ sabato 7 febbraio 2009 17:51

Print

Comments on this entry:

# re: Save Button & UpdateSourceTrigger

Left by Federico at 07/02/2009 23:39
Gravatar
Sono onorato che tu abbia commentato un mio post :)

1) per ora non mi sono ancora preoccupato di testare tutta la logica (non ho ancora studiato l'unit testing)

2) Mah guarda, ho visto opinioni differenti a proposito...comunque non saprei bene se metterla nella classe che eredita da ValidationRule o nel DomainModel...ci studierò sopra :)

3) non conosco ancora la cross-validation o meglio ho letto solo un articolo di sacha su codeproject...ma non serviva nel mio caso :)
Comments have been closed on this topic.