C# Von Command auf View Objekt zugreifen

Donnidonis

Commander
Registriert
Apr. 2009
Beiträge
2.804
Guten Tag,

ich arbeite im Moment an einer WPF Applikation. In der Applikation habe ich ein DataGrid Objekt. Für dieses habe ich ein KeyBinding für STRG+C angelegt, sodass ein Command aufgerufen wird, auch per Binding. Jetzt würde ich gerne an das Command die aktuell selektierte Spalte übergeben, also den Index. Leider fehlt mir da irgendwie der Ansatzpunkt. Wie gehe ich dabei am besten vor? Es ist ja sicher nicht der Sinn das View-Objekt mit in dem ViewModel anzulegen, oder? Wie gehe ich generell vor, wenn ich auf View-Eigenschaften im ViewModel oder einem Command zugreifen möchte?

Liebe Grüße
 
Neben Command kannst du auch einen CommandParameter binden. Die andere Möglichkeit ist eine Property in deinem ViewModel zu haben, die an sowas wie SelectedItem oder SelectedIndex bindet. Die kannst du dann einfach verwenden. Wie das konkret beim Spaltenindex eines DataGrids am besten funktioniert, kann ich dir aus dem stehgreif jetzt leider nicht sagen.
 
Ja mit dem Command Parameter habe ich auch überlegt, aber wie kann ich dort eine Eigenschaft der View übergeben?
 
Versuch mal an die SelectedCells-Eigenschaft deines DataGrids zu binden:
Code:
<DataGrid ItemsSource="{Binding Items}">
  <DataGrid.InputBindings>
    <KeyBinding Command="{Binding TestCmd}"
                CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}, Path=SelectedCells}"
                Key="C"
                Modifiers="Control" />
  </DataGrid.InputBindings>
</DataGrid>

Dann kannst du im CommandExecuted-Event den Parameter entsprechend in eine IList<DataGridCellInfo> casten und dir deine Spaltennummer(n) aus den Zellen auslesen. :)
 
Puh okay also soweit bin ich gekommen. Das Problem ist: Wie bekomme ich nun den Spalten Index?
Im Debugger ist das kein Problem, da kann ich auch die nicht öffentlichen Member sehen, wo auch genau das drin steht was ich brauche.
Aber wenn ich per STRG+C das Command auslöse stehen in der List erst einmal alle 4 Columns drin, das bringt mich leider nicht weiter..
Oder habe ich etwas entschiedenes übersehen?

EDIT:
Ja, ich habe was übersehen, muss die SelectionUnit natürlich auch auf Cell stellen und nicht FullRow :D
Jetzt läuft alles, vielen Dank!
 
Selbst wenn du FullRow aktiv hast, kommst du zumindest an die Collection ran.
Du hast natürlich recht, dass es ziemlich sinnlos ist, die Spaltenindizes von alles Spalten rauszufinden. ;)

Wenns noch Probleme geben sollte, meld dich!

Code:
private void TestCmd_CommandExecuted(object sender, CommandEventArgs e)
{
   foreach (DataGridCellInfo cell in (IList<DataGridCellInfo>)e.CommandParameter)
   {
      int spaltennummer = cell.Column.DisplayIndex;
      [...]
   }
}
 
Zuletzt bearbeitet:
Zurück
Oben