2016-08-10 2 views
0

Ich habe ein Datagrid, die in jeder Zeile wie diese eine Löschtaste enthält:Wie die CurrentRow von Datagrid in Ansichtsmodell erhalten

<Button Command="{Binding DeleteRowCriterionCommand}">Delete</Button> 

Aber ich weiß nicht, wie die currentItem Eigenschaft zu erhalten, ohne das Datagrid zu verwenden .name

<!-- 2ND : CRITERIA --> 
    <Grid> 
     <DataGrid ItemsSource="{Binding UserCriteria, Mode=TwoWay}" SelectedItem="{Binding SelectedItemDG, Mode=TwoWay}" AutoGenerateColumns="False"> 
      <DataGrid.Columns> 

       <!--TEXTBOX FOR SQL VALUES--> 
       <DataGridTemplateColumn Header="SQLValue" Width="600"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <TextBox /> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 

       <!-- BUTTON FOR DELETING --> 
       <DataGridTemplateColumn Width="*"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <Button Command="{Binding DeleteRowCriterionCommand}">Delete</Button> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 

      </DataGrid.Columns> 
     </DataGrid> 
    </Grid> 

ich MVVMLight bin mit, so weiß ich, wie mein Befehl an mein Viewmodel zu verbinden, aber das einzige, was fehlt den Index der Zeile, wo ich auf die Schaltfläche klicken. Diese

ist die Funktion von DataGrid.Name mit:

public void DeleteRowCriterion() 
{ 
    // I would like to replace the first line by not using DataGridName 

    // int currentRowIndex = DataGridName.Items.IndexOf(CriteriaDG.CurrentItem); 
    // UserCriteria.RemoveAt(currentRowIndex); 
} 

Wenn jemand weiß, wie es zu tun ist, werde ich das schätzen!

+0

Könnten Sie Bitte fügen Sie das komplette XAML für '

+0

hinzufügen Ich habe meinen Beitrag bearbeitet, indem ich das gesamte' DataGrid' hinzugefügt habe. In der Tat habe ich 'CommandParameter' nicht verwendet, ich kannte diese Eigenschaft nicht – Destunk

+0

Sie müssen einige Befehlsparameter hinzufügen: [Probieren Sie dieses Beispiel] (http://stackoverflow.com/questions/12371253/how-do-i -pass-a-variable-as-a-command-Parameter) –

Antwort

1

Für diejenigen, die das gleiche Problem haben als ich, ist dies die Lösung ist:

In XAML, müssen Sie die Parameter auf Ihre Schaltfläche hinzuzufügen. Es enthält den Index der Zeile! (Nichts ändern, es funktioniert unabhängig auf den Namen des Datagrid)

CommandParameter="{Binding Path=SelectedIndex, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}">Delete</Button> 

Dann in Ihrem Ansichtsmodell, müssen Sie Ihre RelayCommand

public RelayCommand<Object> DeleteRowCriterionCommand { get; private set; } 

Sie erstellen haben die <Object> wenn hinzufügen Sie möchten den Parameter übernehmen, den Sie in CommandParameter hinzugefügt haben. Dann können Sie zB Ihre Immobilie in Ihrem Konstruktor

DeleteRowCriterionCommand = new RelayCommand<Object>(param => DeleteRowCriterion(param), param => CanDeleteRowCriterion()); 

Jetzt können Sie Ihre Parameter in Ihrer Funktion:

private void DeleteRowCriterion(object parameter) 
{ 
    UserCriteria.RemoveAt(Convert.ToInt32(parameter)); 
} 

Ich hoffe, dass es einige von euch hoffentlich :)

0

Wie wäre es mit der Schaltfläche als "Absender" und dann den SelectedIndex des Datagrid durch Eltern?

+0

Wie machst du das? Weil das keine Bindung verwendet, nicht wahr? – Destunk

+0

public void DeleteRowCriterion (Objektabsender, RoutedEventArgs e) { var button = (Button) sender; Datagrid dg = button.GetParent() // vergaß die acutal-Methode, aber vielleicht hilft dies als Basis } –

+0

Es funktioniert wie Sie tun, aber das ist nicht verbindlich. Ich habe es gefunden, aber danke für deine Zeit! – Destunk

Verwandte Themen