13 messaggi dal 08 marzo 2005
Buongiorno a tutti

Ho un quesito concettuale dovuto alla poca conoscenza diwpf co mvvm.

Ho una window con una datagrid con validazione:

Nel xaml faccio la validazione così:

  <DataGrid.RowValidationErrorTemplate>
       <ControlTemplate>
            <Grid Margin="0,-0,0,-0" ToolTip="{Binding RelativeSource={RelativeSource FindAncestor, 
               AncestorType={x:Type DataGridRow}}, Path=(Validation.Errors)[0].ErrorContent}">
                        <Ellipse StrokeThickness="3" Fill="Red"  Width="{TemplateBinding FontSize}" Height=" 
                            {TemplateBinding FontSize}" />
                        <TextBlock Text="!" FontSize="{TemplateBinding FontSize}" FontWeight="Bold" 
                              Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center" />
                        <StackPanel>
                            <AdornedElementPlaceholder x:Name="atextBox"/>
                            <TextBlock Text="{Binding (Validation.Errors)[0].ErrorContent}" 
                                  Foreground="Black"/>
                        </StackPanel>               
                    </Grid>
        </ControlTemplate>
   </DataGrid.RowValidationErrorTemplate>

   <DataGrid.RowValidationRules>
        <ViewModel1:myValidationProduction ValidationStep="UpdatedValue"/>
   </DataGrid.RowValidationRules>
                
 



nella classe behind:
    public class myValidationProduction : System.Windows.Controls.ValidationRule
    {
        internal bool Prod_Mod;
        List RC_ProductionMemMaps;

        static readonly System.Text.RegularExpressions.Regex MyNameEx = new System.Text.RegularExpressions.Regex(@"^[A-Za-z]");
        
        static readonly System.Text.RegularExpressions.Regex MyNameEx1 = new System.Text.RegularExpressions.Regex(@"^[A-Za-z]");
        
<!-- costruttore -->
public myValidationProduction()
        {
           &#8230;...
 



Vorrei ,dopo ogni validazione, impostare un dato che nel mio caso è:
internal bool Prod_Mod, all'interno della cls myValidationProduction,che posso poi valutare dalla classe model del MVVM (prodMODEL.cs) .

Come faccio a pescare l'istanza della classe myValidationProduction dalla classe model prodMODEL.cs) ?

O c'è altro sistema per far ciò che chiedo ?

ciao
Modificato da atjbat il 29 agosto 2019 08:31 -
13 messaggi dal 08 marzo 2005
Provo a formulare il quesito in altro modo:

Avendo una window wind1.xaml che ha al suo interno una validazione riferita alla classe valida.cs:
  <DataGrid.RowValidationRules>
                <ViewModel1:valida ValidationStep="UpdatedValue"/>
 </DataGrid.RowValidationRules>


e avendo il datacontext su altra classe: wind1Model.cs
            var dtx = new wind1Model();
            this.DataContext = dtx ;


come è possibile fare interagire l'oggetto della classe wind1Model con l'oggetto creato dalla classe di validazione : valida ? Come ci si riferisce all'oggetto creato dalla RowValidationRules?
11.792 messaggi dal 09 febbraio 2002
Contributi
Ciao, prendi spunto dall'esempio che è qui:

https://docs.microsoft.com/it-it/dotnet/framework/wpf/controls/how-to-implement-validation-with-the-datagrid-control#to-validate-multiple-values-in-a-single-row

Ti mostra proprio come la classe di validazione riceva l'oggetto come parametro del suo metodo Validate.
Ecco la riga interessante:
public override ValidationResult Validate(object value,
        System.Globalization.CultureInfo cultureInfo)


Vedi quel parametro object value? In esso è incapsulato l'oggetto da validare. Nell'esempio viene recuperato così:
Course course = (value as BindingGroup).Items[0] as Course;


Però non ho ben capito se tu hai anche bisogno di ottenere un riferimento all'intero oggetto wind1Model. Se sì, perché e come devi usarlo?

ciao,
Moreno
Modificato da BrightSoul il 29 agosto 2019 23:42 -

Enjoy learning and just keep making
13 messaggi dal 08 marzo 2005
Intanto grazie della risposta che mi fa respirare xkè sono abbastanza nella c....

Mi serve un riferimento nel model perché il progetto che ho fatto ha una Windows base (con il suo model in mvvm) con dentro un usercontrol che fa da pulsantiera per cambiare pagina, se uno preme un pulsante per cambiare pagina io voglio sapere se ha fatto modifiche sulla griglia per chiedergli se vuole salvare o no le modifiche .
Non voglio chiederlo dopo ogni modifica perché sarebbe troppo scomodo, al momento dell'uscita dalla pagina ,se ha fatto modifiche ,chiedo.
L'alternativa che stavo provando è creare un trigger sull'editazione di una cella:
<e:Interaction.Triggers>
                <e:EventTrigger EventName="CellEdit">
                    <e:InvokeCommandAction Command="{Binding myCellEdit}"/>
                </e:EventTrigger>
</e:Interaction.Triggers>

Modificato da atjbat il 30 agosto 2019 08:55 -

PS: L'esempio che mi hai mandato è esattamente quello che ho usato e funziona perfettamente , in modo molto bovino potrei impostare una bool public static a livello di applicazione e lavorare con quella ma vorrei capire come risolvere con filosofia wpf mvvm non le mie solite spaghetti code
Modificato da atjbat il 30 agosto 2019 09:17 -
11.792 messaggi dal 09 febbraio 2002
Contributi
Ciao,


se uno preme un pulsante per cambiare pagina io voglio sapere se ha fatto modifiche sulla griglia

Mah, secondo me il change tracking non è un requisito da implementare con i validator, perché il loro scopo è quello di validare un oggetto, non di tenere traccia dei cambiamenti. Ho dei dubbi anche sul trigger su CellEdit perché se l'utente modifica e poi riporta il valore a come era prima, quello non deve essere considerato un cambiamento. Inoltre saresti costretto anche a metterlo ovunque tu voglia supportare il change tracking.

Un'alternativa potrebbe essere quella di implementare il change tracking direttamente nel viewmodel. Ecco una possibile implementazione che ti darà una proprietà "IsDirty" che ti dice se l'oggetto è cambiato o no.
https://www.codeproject.com/Articles/41791/Almost-automatic-INotifyPropertyChanged-automatic

Quando l'utente sta per chiudere la pagina, vai a controllare se IsDirty è true e, se lo è, mostri il messaggio di conferma.

ciao,
Moreno

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.