【问题标题】:TemplateColumn button command binding not working in Syncfusion DataGridTemplateColumn 按钮命令绑定在 Syncfusion DataGrid 中不起作用
【发布时间】:2020-07-22 10:07:30
【问题描述】:

我在 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 
}  

我还尝试了什么
如果x:Bind,我尝试使用Binding,但它也不起作用

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
}

【问题讨论】:

标签: c# xaml uwp syncfusion


【解决方案1】:

TemplateColumn 按钮命令绑定在 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>

【讨论】:

    【解决方案2】:

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

    知识库链接:https://www.syncfusion.com/kb/5910/how-to-pass-row-data-as-parameter-to-the-command-in-viewmodel-when-clicking-the-button-in

    问候,

    Vijayarasan S

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-09
      • 2020-03-06
      • 2019-11-13
      • 2011-09-17
      • 2012-02-17
      相关资源
      最近更新 更多