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.