Laden...

Wie kann ich das IsSelected-Event in einer DataGridRow abfangen?

Erstellt von GeneVorph vor 3 Jahren Letzter Beitrag vor 3 Jahren 1.235 Views
G
GeneVorph Themenstarter:in
180 Beiträge seit 2015
vor 3 Jahren
Wie kann ich das IsSelected-Event in einer DataGridRow abfangen?

Hallo,

ich möchte in einem wpf-Projekt in dem ich ein DataGrid habe jeweils darauf reagieren, ob eine Zeile ausgewählt wurde oder nicht. Im ViewModel habe ich ein Property (IsRowSelected) vom Typ bool.

Dazu habe ich:


<DataGrid AutoGenerateColumns="False" SelectedItem="{Binding SelectedInstrument}" ItemsSource="{Binding AllInstruments}" SelectionMode="Single" Height="100">
     <DataGrid.RowStyle>
          <Style TargetType="{x:Type DataGridRow}">
              <Setter Property="IsSelected" Value="{Binding IsRowSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
           </Style>
     </DataGrid.RowStyle>

<DataGrid.Columns>
    <DataGridTemplateColumn Width="*">
         <DataGridTemplateColumn.Header>
             <TextBlock Text="Instrument"/>
         </DataGridTemplateColumn.Header>
          <DataGridTemplateColumn.CellTemplate>
              <DataTemplate>
                 <TextBlock Text="{Binding InstrumentLabel}"/>
              </DataTemplate>
          </DataGridTemplateColumn.CellTemplate>
<!--...-->
 </DataGridTemplateColumn>

Im ViewModel sollte IsRowSelected eigentlich 'true' sein, wenn ich eine Row im DataGrid anklicke, bzw. 'false', wenn ich ein anderes Steuerelement anklicke.


private string _isRowSelected;

        public string IsRowSelected
        {
            get { return _isRowSelected; }
            set 
            {
                OnPropertyChanged(ref _isRowSelected, value); 
            }
        }

Ich hatte im Setter einen Haltepunkt eingerichtet. Allerdings wird der überhaupt nicht angesprochen, wenn ich im DataGrid eine Row anklicke, also scheint hier etwas grundsätzlich schief zu laufen. Habe ich irgendwo einen offensichtlichen Fehler?

Gruß
vorph

P
441 Beiträge seit 2014
vor 3 Jahren

Ich bin mir nicht sicher, ob ein Style in beide Richtungen funktioniert.

Siehst du denn im Output Binding Fehler?

Das Datagrid sollte ein Event "RowSelected" o.ä. haben, das könntest du mit einem Command verbinden.

190 Beiträge seit 2012
vor 3 Jahren

Hallo,

IsRowSelected ist bei dir vom Typ string und nicht bool.
Binde doch das Property SelectedItem. Dort steht dann die aktuellen Auswahl oder null drin.
Wenn du das Ereignis benötigst, dann nutze SelectionChanged.
Siehe hier: DataGrid bind command to row select

  • Wer lesen kann, ist klar im Vorteil
  • Meistens sitzt der Fehler vorm Monitor
  • "Geht nicht" ist keine Fehlermeldung!
  • "Ich kann programmieren" != "Ich habe den Code bei Google gefunden"

GidF

G
GeneVorph Themenstarter:in
180 Beiträge seit 2015
vor 3 Jahren

Vielen Dank für die Vorschläge (und auch der Fehlerhinweis betreffs Typ meines Properties (string statt bool)).

Ich stelle fest, dass ich mein ursprüngliches Problem nicht gut genug durchdacht habe - und befinde mich gerade programmiertechnisch in einer Sackgasse.

Ich habe auf meinem Usercontrol einen Button, mit dem ich Einträge aus dem Datagrid löschen kann. Ich möchte aber, dass der Löschen-Button nur dann aktiv ist, wenn der User eine Reihe selektiert hat. Daher mein Versuch an den Selected-Event der DataGridRow heranzukommen. Denn - so die Idee - bei der Rückgabe true soll der CanExecute-Command-Handler den Button aktivieren, bei false deaktivieren (ausgegraut).

Mein Denkfehler: wenn ich eine Row anklicke und dann auf den Button klicke, wird die Row ja ebenfalls deselektiert (womit der Wert wieder false wäre) und mein Button wäre wieder ausgegraut.

Von der designtechnischen Seite ist es aber unbefriedigend, wenn man dem User keinen Hinweis geben kann, was er da gerade löscht. So wie es jetzt ist, klickt man die Row an und dann z. B. eine Textbox. Dabei ist das SelectedItem dann immer noch das Item der letzten Row, die man angeklickt hat - obwohl das DataGrid dann längst keinen Focus mehr hat. Nur, dass man es jetzt optisch nicht mehr wahrnimmt.

Irgendeine Idee, wie sich das vernünftig lösen ließe?

Und mal rein aus Neugier: das DataGridRow hat einen eigenen Satz an Events und Properties, über die Datagrid nicht verfügt. Wie kann ich diese über Interactions/Behavior ansprechen?

G
GeneVorph Themenstarter:in
180 Beiträge seit 2015
vor 3 Jahren

Da sollte dir
>
helfen.

Danke! Das ist ein vielversprechender Ansatz - mal sehen, ob ich da was draus basteln kann...