Laden...

Wie kann ich einen Button disablen wenn im DataGrid eine ValidationRule auslöst?

Erstellt von SimpleTool vor 3 Jahren Letzter Beitrag vor 3 Jahren 558 Views
SimpleTool Themenstarter:in
12 Beiträge seit 2020
vor 3 Jahren
Wie kann ich einen Button disablen wenn im DataGrid eine ValidationRule auslöst?

Hi,

das DataGrid lässt mir keine Ruhe 😁 und so hab ich ein weiteres Problem bei dem ich nicht weiß welche Lösung ich anstreben soll.
**
Was möchte ich erreichen:***Ein Button soll disabled sein wenn im DataGrid eine ValidationRule auslöst

Wie ist mein DataGrid aufgebaut?


        <DataGrid Name="myDataGrid"
                      VerticalScrollBarVisibility="Auto" ItemsSource="{Binding}" 
                      AutoGenerateColumns="False" Validation.Error="myDataGrid_Error">

            <DataGrid.Columns>


                <DataGridTextColumn Header="OffsetByte" x:Name="dgcolumn" >
                    <DataGridTextColumn.Binding>
                        <Binding Path="OffsetByte" UpdateSourceTrigger="PropertyChanged" StringFormat="d" ValidatesOnDataErrors="True">
                            <Binding.ValidationRules>
                                <DataErrorValidationRule ValidationStep="UpdatedValue" ValidatesOnTargetUpdated="True"/>
                            </Binding.ValidationRules>
                        </Binding>
                    </DataGridTextColumn.Binding>
                </DataGridTextColumn>

                <DataGridTextColumn Header="test" Binding="{Binding Test}"/>
            </DataGrid.Columns>

        </DataGrid>


Besonderheit:*Ich benutze keine eigene ValidationRule sondern arbeite mit DataErrorValidationRule und StringFormat. *DataGrid wird im CodeBehind mit ObserveableCollection<MEINDATENTYP> verbunden mit "myDatagrid.ItemsSource = Liste".

Jetzt würde ich gerne einen Button disablen wenn eben ein DataGrid-Cell eine Fehleingabe hat (z. B. es wird ein Buchstabe statt eine Zahl eingegeben). Wenn das kein DataGrid sondern eine TextBox ist bekomme ich das hin, aber hier weiß ich nicht weiter.

Was habe ich bereits probiert*Ich wollte den Validation Error zum DataGrid "bubblen", sodass ich HasError vom DataGrid in xaml binden könnte. Aber das hab ich nicht hin bekommen. Dafür habe ich auch probiert RowValidation zu erstellen die in der Zeile die Cell-Errors abfragen soll und dann vom RowValidation wollt ich das dem DataGrid übergeben. *WPF-Command beim Button habe ich auch versucht, und zwar wollte ich da das DataGrid übergeben und so jede Zelle durchsuchen nach HasError. Den code dafür habe ich, aber hier scheitere ich bei der Übergabe des DataGrids mit Elementname. Der Übergabeparameter lässt sich dann im WPF-Command nicht zum DataGrid wandeln sondern ist nun meine ObservableCollection<> *Im Internet wenn ich danach suche finde ich immer Ansätze bzgl. INotifyDataError bzw. IDataErrorInfo. So wie ich das verstanden habe müsste ich aber in meiner Klasse, die ich in meiner ObserveableCollection<> habe dann das implementieren. Ansich ist das kein Problem, jedoch hab ich ja dann mit DataErrorValidationRule schon eine Kontrolle ob die Eingabe korrekt ist. Hätte dann somit an zwei Stellen im Programm so eine Prüfung. *Wenn CellEditEnding ist wollte ich eine Sammelvariable z. B. "DataGridHasError" **beschreiben **wenn im DataGrid ein HasError ist. Problem ist aber, das nach CellEditEnding im "object sender = DataGrid" noch nicht der neuste Wert steht. (Code hätte ich und funktioniert, aber es steht halt der alte Wert noch im DataGrid) Hier weiß ich nicht wie ich am besten den an diesem Punkt aktualisiere bzw. evtl. ein eigenes Event oder so trigger der dann die Zellen nach HasError abfragt.

**Wie würdet ihr den Button disablen wenn im DataGrid ein ValidationError entseht?***INotifyDataError bzw. IDataErrorInfo in der Klasse die mit ObserveableCollection<> mit dem DataGrid verknüpft ist implementieren? *Kann man doch das DataGrid bzw. ein gesammelten HasError für das WPF-Command in xaml binden? *Oder kann man eine Sammelvariable im Code-Behind beschreiben?

Ich hoffe ihr könnt mir ein paar Anregungen geben, da beim Durchsuchen des Interent und Forums nicht auf eine Antwort gekommen bin.

Vielen Dank schon mal.
Liebe Grüße

5.658 Beiträge seit 2006
vor 3 Jahren

Wie würdet ihr den Button disablen wenn im DataGrid ein ValidationError entseht?

Gar nicht, ich würde ein DataGrid nicht für die Dateneingabe verwenden.

Im Internet wenn ich danach suche finde ich immer Ansätze bzgl. INotifyDataError bzw. IDataErrorInfo. So wie ich das verstanden habe müsste ich aber in meiner Klasse, die ich in meiner ObserveableCollection<> habe dann das implementieren. Ansich ist das kein Problem, jedoch hab ich ja dann mit DataErrorValidationRule schon eine Kontrolle ob die Eingabe korrekt ist. Hätte dann somit an zwei Stellen im Programm so eine Prüfung.

Ein Interface zu implementieren, verlangt von dir nicht, die Funktionalität neu zu implementieren. Wenn deine Validierungsfunktion flexibel genug aufgebaut ist, dann kann sie auch von beiden Interface-Implementierungen verwendet werden.

Weeks of programming can save you hours of planning

SimpleTool Themenstarter:in
12 Beiträge seit 2020
vor 3 Jahren

Hi,

ich hab hier mal weiter gesucht und versucht das umzusetzen. Dabei habe ich ein Beispiel der Implementierung des IDataErrorInfos gesehen
Beispiel UserControl mit IDataErrorInfo

Bei dem Beispiel wurde die Validierung vom Inhalt der Textboxen in einem "UserControl" wie folgt umgesetzt:*Es wurde eine Klasse erstellt die dann mit UserControl verbunden wird. Diese beinhaltet das IDataErrorInfo wo die Daten auf dessen Richtigkeit geprüft werden *Die Klasse wird dann an das UserControl gebindet wo dann der IDataErrorInfo diese Daten abgreift und diese für z. B. die Textbox setzt *Also wurde das Error innerhalb der über DataContext gebundenen Klasse ermittelt und nur bis zum Usercontrol z. B. Anzeige im ToolTip weiter gegeben.

Meine Validierung beim DataGridColumn habe ich aber jetzt nicht über die gebundene Klasse gemacht, **sondern mit **einer ValidationRule Klasse. Kann man dieses Validation Error dann auch irgendwie in XAML z. B. an den Button WPF-Command binden?!
-> Bei mir erkennt die DataGridCell in Verbindung mit ValidationRule Klasse das der Inhalt inkorrekt ist und nicht wie bei dem Beispiel oben die Klasse die daran gebunden ist.
-> sollt ich hier mein Validation ändern damit ich so ein "Sammel-HasError" erstellen kann/abfragen kann ob das DataGrid irgendein Fehler hat?

Ich hoffe ihr könnt mir ein Tipp geben.
Vielen Dank schon mal im Voraus.

Liebe Grüße

5.658 Beiträge seit 2006
vor 3 Jahren

Mich wundert es ein wenig, daß eine so einfache Sache wie die Validierung der eingegebenen Daten so kompliziert sein kann. Und ich verstehe wirklich nicht, wo das Problem liegt. Allerdings kann ich dazu auch nicht viel beitragen, weil ich wie gesagt ein DataGrid nicht für die Dateneingabe verwenden würde.

Wahrscheinlich klingt es erstmal nach weniger Arbeit, wenn man das gleiche Steuerelement für die Anzeige von Listen und die Bearbeitung verwendet, aber da unterschätzt man einfach die Komplexität, wie du gerade selbst feststellen kannst.

Es gibt auch nur sehr wenige Anwendungsfälle, wo der Benutzer gleichzeitig hunderte oder tausende Datensätze bearbeiten muß, z.B. eine Tabellenkalkulation oder Massenimporte. In allen anderen Fällen ist es aber eher ein UX-Antipattern.

Es wäre doch so viel einfacher, wenn bei einem (Doppel-)Klick auf einen Datensatz ein Bereich oder ein Fenster mit einem Detail-Formular aufgeht, wo der Benutzer den Datensatz editieren kann. Und erst wenn dort alle Daten fehlerfrei eingegeben wurden, dann werden die Änderungen übernommen, und die Liste aktualisiert.

Wenn das für dich aus irgendwelchen Gründen nicht in Frage kommt, dann könntest du die Validierung auch einfach im ViewModel durchführen und fehlerhafte Eingaben einfach ignorieren:


public string SomeProperty
{
  get => someProperty;
  set 
  {
    if (someProperty == value || string.IsNullOrEmpty(value))
      return;
    someProperty = value;
    OnPropertyChanged(nameof(SomeProperty));
  }
}

Weeks of programming can save you hours of planning