Laden...

Datagridcell Wert übergeben und Spaltenindex oder Namen der Column ermitteln

Erstellt von RobAll vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.735 Views
R
RobAll Themenstarter:in
17 Beiträge seit 2017
vor 4 Jahren
Datagridcell Wert übergeben und Spaltenindex oder Namen der Column ermitteln

Hallo, ich versuche seid dem Umstieg auf MVVM vergebens eine DataGridCelle zu manipulieren.
Ich muss der Celle einen Wert aus einem Nummerngenerator übergeben,
und vorab auch den Spaltenindex oder Namen der gewählten Column ermitteln

Mein Code: ähnlich
https://social.msdn.microsoft.com/Forums/vstudio/en-US/c18baa39-ec42-422e-bf26-eb85b3a1070d/listview-mvvm-how-do-i-get-the-value-of-a-selected-cell?forum=wpf

XAML

                    <DataGrid
..
                    DataContext="{StaticResource vm}"
                    Focusable="true"
                    SelectionUnit="Cell"
                    SelectionMode="Single"
                    CurrentCell ="{Binding CellInfo, Mode=TwoWay}"

XAML

Im MainViewModel

 private DataGridCellInfo _cellInfo;
        public DataGridCellInfo CellInfo
        {
            get { return _cellInfo; }
            set
            {
                _cellInfo = value;
                //OnPropertyChanged("CellInfo");
                //MessageBox.Show(string.Format("Column: {0}",
                //                _cellInfo.Column.DisplayIndex != null ? _cellInfo.Column.DisplayIndex.ToString() : "Index out of range!"));
            }
        }

Wer kann helfen, oder hat eine Idee ich kann weder get oder set Werte abrufen.

16.807 Beiträge seit 2008
vor 4 Jahren

In MVVM bindest Du gegen ein konkretes Objekt, zB. ein ViewModel oder ein spezifisches Modell.

Mir ist nicht ganz klar, was Du da ingesamt vor hast; aber statt der DataGridCellInfo würdest Du eben eine Collection zum Binden des Grids haben.
Und ein Objekt in der Collection hätte dann die Nummer enthalten.

Siehe dazu die Beispiele in [Artikel] MVVM und DataBinding

R
RobAll Themenstarter:in
17 Beiträge seit 2017
vor 4 Jahren

Danke für die Info.

Ich habe das DataGrid mit einer listcollectionview gebunden.

Über die Eigenschaft listcollectionview CurrentItem
werde ich den Wert manipulieren, funktioniert

Trotzdem benötige ich noch den ColumnHeader der DataGridSpalte.
Wie komme ich aus dem ViewModel da ran?

16.807 Beiträge seit 2008
vor 4 Jahren

Die View kennt das ViewModel; aber nicht umgekehrt.
Wenn Du im ViewModel etwas aus der View benötigst, dann hast Du einen kleinen Fehler im Konzept.

R
RobAll Themenstarter:in
17 Beiträge seit 2017
vor 4 Jahren

Im DataGrid habe ich die Spalte Gerätenummer / Baugruppennummer / Einzelteilnummer,

je nach dem in welcher Spalte ich die Celle focusiere, soll der Nummerngenerator auf einen anderen Nummernkreis zugreifen, oder auch das Command deaktivieren.

Dazu benötige ich den Columnheader oder Index?

Wo ist da ein Konzeptfehler?

Im DataGrid gibt es die Eigenschaft CurrentColumn="" ,
kann ich die an das ViewModel binden.

Wie kann ich den DataGrid Spaltenindex / Spaltenheader binden,
hab da schon einiges getestet, die Werte waren immer null.

Danke vorab

16.807 Beiträge seit 2008
vor 4 Jahren

Wenn Du etwas aktiv aus der View laden musst, dann ist das ein Konzeptfehler.
Der Sinn und das Konzept sollte immer sein, dass die View alle notwendigen Informationen aktiv bereit stellt.

Hier kannst Du im Prinzip den Index der selektierten Spalte / binden.
Damit hast Du dann im ViewModel die Information, was selektiert wurde - damit hast Du auch kein aktives "Holen von Informationen" und ist damit sauber.

Du kannst auch über den DisplayIndex über die Spalte der selektierten Zelle zugreifen; brauchst Du aber nicht, wenn Du mit Binding arbeitest (im Prinzip der Zugriff auf die DataGridCellInfo).
Aber damit hast Du eine Abhängigkeit im ViewModel.

R
RobAll Themenstarter:in
17 Beiträge seit 2017
vor 4 Jahren

Hallo, ich möchte nach dem Command, sofort den neuen Value in der Zelle sehen.

1.
ich focusiere die DataGridZelle, und führe das Command aus.
Der neue Value wird erst visualisiert, wenn ich in DataGridCellEdit wechsel.

2.
Wechsel ich sofort in den DataGridCellEdit, und führe das Command aus,
wird der neue Value erst visualisiert, wenn ich in eine andere Zelle focusiere.

listcollectionview.refresh(); updatet, dauert aber zu lange.

Gibt es eine Möglichkeit nur das geänderte Objekt zu refreshen?

Oder gibt es über XAML DataGridCellEdit eine Möglichkeit?

Danke

R
RobAll Themenstarter:in
17 Beiträge seit 2017
vor 4 Jahren

Leider funktioniert

 Binding="{Binding Einzelteilnummer.Value, UpdateSourceTrigger=PropertyChanged}" 

nicht.

Erst beim Click in eine andere Zelle(Lost Focus) aktualisiert die DataGridCell

Wer hat noch eine Idee?

S
9 Beiträge seit 2019
vor 4 Jahren

du solltest bei nutzung eines datagrids mit einer observablecollection arbeiten anstatt einer liste.

eine observablecollection hat den vorteil das, dass view sich sofort ändert sobald sich ein wert in der collection ändert. eine liste besitzt diese eigenschaft oder besser gesagt dieses event nicht.

am besten nochmal etwas über MVVM recherchieren.

gruß