我有一个DataGrid,每行包含一个删除按钮,如下所示:
<Button Command="{Binding DeleteRowCriterionCommand}">Delete</Button>
但我不知道如何在不使用DataGrid.Name的情况下获取currentItem属性
<!-- 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>
我使用MVVMLight,所以我知道如何将我的命令连接到我的ViewModel,但唯一缺少的是获取我点击按钮的行的索引。
这是使用DataGrid.Name的函数:
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);
}
如果有人知道该怎么做,我会很感激!
答案 0 :(得分:3)
对于那些遇到与我相同问题的人,这就是解决方案:
在XAML中,您必须将参数添加到按钮中。它包含行的索引! (不要改变任何东西,它独立于DataGrid的名称)
CommandParameter="{Binding Path=SelectedIndex, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}">Delete</Button>
然后,在ViewModel中,您必须创建RelayCommand
public RelayCommand<Object> DeleteRowCriterionCommand { get; private set; }
如果您想要在<Object>
中添加参数,则必须添加CommandParameter
。然后,在构造函数中实例化您的属性
DeleteRowCriterionCommand = new RelayCommand<Object>(param => DeleteRowCriterion(param), param => CanDeleteRowCriterion());
现在,您可以在函数中使用参数:
private void DeleteRowCriterion(object parameter)
{
UserCriteria.RemoveAt(Convert.ToInt32(parameter));
}
我希望它能帮助你们中的一些人:)
答案 1 :(得分:0)
如何使用按钮作为&#34;发件人&#34;然后通过父级获取Datagrid的SelectedIndex?