【问题标题】:How to get the currentrow from DataGrid in ViewModel如何从 ViewModel 中的 DataGrid 获取当前行
【发布时间】:2016-12-16 11:43:47
【问题描述】:

我有一个 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);
}

如果有人知道怎么做,我将不胜感激!

【问题讨论】:

  • 能否请您包含&lt;DataGrid 的完整xaml,我认为您必须添加一些CommandParameter=""
  • 我编辑了我的帖子,添加了整个 DataGrid。确实,我没用CommandParameter,不知道这个属性
  • 需要添加一些命令参数:try this example
  • 我不知道我是否清楚,但我不想将一个类的属性作为参数,我只想获取按钮所在行的索引

标签: c# wpf mvvm datagrid


【解决方案1】:

对于那些和我有同样问题的人来说,这就是解决方案:

在您的 XAML 中,您必须将参数添加到您的按钮。它包含行的索引! (不要改变任何东西,它独立于 DataGrid 的名称)

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

然后,在您的 ViewModel 中,您必须创建您的 RelayCommand

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

如果您想采用您在CommandParameter 中添加的参数,您必须添加&lt;Object&gt;。然后,您在构造函数中实例化您的属性

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

现在,您可以在函数中使用参数:

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

我希望它会希望你们中的一些人:)

【讨论】:

    【解决方案2】:

    如何将按钮用作“发送者”,然后通过父级获取 Datagrid 的 SelectedIndex?

    【讨论】:

    • 你是怎么做到的?因为这没有使用绑定,不是吗?
    • public void DeleteRowCriterion(object sender, RoutedEventArgs e) { var button = (Button) sender; Datagrid dg = button.GetParent() //忘记了实际方法,但这可能有助于基本 }
    • 它就像你正在做的那样工作,但这不是使用绑定。我找到了方法,但感谢您的时间!
    • 抱歉,很高兴你找到了你要找的东西。很好的解决方案感谢分享
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 2016-12-10
    • 1970-01-01
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多