TemplateColumn 按钮命令绑定在 Syncfusion DataGrid 中不起作用

TemplateColumn button command binding not working in Syncfusion DataGrid

我在 UWP 项目中使用 Syncfusion 的数据网格。除了 GridTemplateColumn 内按钮的命令绑定外,一切正常。可能是什么问题?

XAML

<my:GridTemplateColumn MappingName="Actions" HeaderText="Actions"
                       AllowFiltering="False">
    <my:GridTemplateColumn.CellTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal" Spacing="0"  HorizontalAlignment="Center">
                <Button  VerticalAlignment="Center" Width="40" Content="Delete"   
                         my:FocusManagerHelper.FocusedElement="True"
                              Command="{x:Bind ViewModel.RemoveBtnCommand}"/>
            </StackPanel>
        </DataTemplate>
    </my:GridTemplateColumn.CellTemplate>
</my:GridTemplateColumn>  

查看模型

public ICommand RemoveBtnCommand { get; }
public HRMDepartmentsViewModel()
{
    IsActive = true;
    RemoveBtnCommand = new AsyncRelayCommand(CommandRemoveBtnClickedExecute);
}
private async Task CommandRemoveBtnClickedExecute()
{
  // never executed-- code here 
}  

我还尝试了什么
我尝试使用 Binding 代替 if x:Bind 但它也不起作用

Command="{Binding Path=RemoveBtnCommand}" CommandParameter="{Binding}"  

观察

如果我不使用 Command 并使用 Click 事件绑定,它就可以工作。

<my:GridTemplateColumn MappingName="Actions" HeaderText="Actions"
                       AllowFiltering="False">
    <my:GridTemplateColumn.CellTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal" Spacing="0"  HorizontalAlignment="Center">
                <Button  VerticalAlignment="Center" Width="40" Content="Delete"
                         Click="{x:Bind ViewModel.ButtonBase_OnClick}"/>
            </StackPanel>
        </DataTemplate>
    </my:GridTemplateColumn.CellTemplate>
</my:GridTemplateColumn>  

查看模型

public void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
    // It gets called
}

TemplateColumn button command binding not working in Syncfusion DataGrid

恐怕你不能像上面那样在DataTemplate中绑定按钮命令,因为命令找不到正确的DataContext。如果你想绑定 ViewModel 的 RemoveBtnCommand,你需要获取根 DataContext 然后直接到 RemoveBtnCommand 属性。更多请参考以下代码

<Page.DataContext>
    <local:MainViewModel x:Name="ViewModel" />
</Page.DataContext>
<Grid>
    <Custom:SfDataGrid x:Name="MyDataGrid" ItemsSource="{Binding Orders}">
        <Custom:SfDataGrid.Columns>
            <Custom:GridTemplateColumn
                AllowFiltering="False"
                HeaderText="Actions"
                MappingName="Actions"
                >
                <Custom:GridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel
                            HorizontalAlignment="Center"
                            Orientation="Horizontal"
                            Spacing="0"
                            >
                            <TextBlock Text="{Binding Name}" />
                            <Button
                                Width="40"
                                VerticalAlignment="Center"
                                Custom:FocusManagerHelper.FocusedElement="True"
                                Command="{Binding ElementName=MyDataGrid, Path=DataContext.RemoveBtnCommand}"
                                Content="Delete"
                                />
                        </StackPanel>
                    </DataTemplate>
                </Custom:GridTemplateColumn.CellTemplate>
            </Custom:GridTemplateColumn>
        </Custom:SfDataGrid.Columns>
    </Custom:SfDataGrid>
</Grid>

当通过传递 CommandParameter 单击 TemplateColumn 中的按钮时,您可以通过将行信息作为参数传递给 ViewModel 中的命令来实现您的要求。请参阅以下知识库文档以获取更多详细信息参考,

KB Link:https://www.syncfusion.com/kb/5910/how-to-pass-row-data-as-parameter-to-the-command-in-viewmodel-when-clicking-the-button-in

此致,

维杰亚拉桑 S