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.
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
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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?
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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
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?
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ß