Binding Command in TemplatedColumn in RadDataGrid UWP



我正在开发一个UWP应用程序,我需要在Telerik的RadDataGrid控件中显示数据。在一个场景中,我需要使用 TemplatedColumn 显示数据并将命令绑定到放置在其 DataTemplate 中的控件,但命令不会在 ViewModel 中触发,但是当我将事件附加到这些控件时,事件会在代码隐藏中触发。

这是代码:

 <Interactivity:Interaction.Behaviors>
    <Core:EventTriggerBehavior EventName="Loaded">
        <Core:CallMethodAction MethodName="LoadData"
                               TargetObject="{Binding}" />
    </Core:EventTriggerBehavior>
</Interactivity:Interaction.Behaviors>
 <Grid x:Name="gdRoot">
    <telerikGrid:RadDataGrid ItemsSource="{x:Bind AvailableVM.PickListItems,Mode=OneWay}"
                             Background="{StaticResource GridLinesBrush}"
                             SelectionUnit="Cell"
                             GridLinesBrush="{StaticResource GridLinesBrush}"
                             AlternateRowBackground="{StaticResource AlternateRowBackground}"
                             AutoGenerateColumns="False"
                             ScrollViewer.VerticalScrollBarVisibility="Hidden">
        <telerikGrid:RadDataGrid.Columns>
            <telerikGrid:DataGridTemplateColumn Header="Assign"
                                                SizeMode="Auto">
                <telerikGrid:DataGridTemplateColumn.CellContentTemplate>
                    <DataTemplate>
                            <Button Background="Transparent"
                                    Command="{Binding DataContext.ListSelectedCommand, ElementName=gdRoot}"/>
                    </DataTemplate>
                </telerikGrid:DataGridTemplateColumn.CellContentTemplate>
            </telerikGrid:DataGridTemplateColumn>
        </telerikGrid:RadDataGrid.Columns>
    </telerikGrid:RadDataGrid>
</Grid>

下面是视图模型代码:

private ICommand _listSelectedCommand;
    public ICommand ListSelectedCommand
    {
        get { return _listSelectedCommand; }
        set { Set(nameof(ListSelectedCommand), ref _listSelectedCommand,value); }
    }
 public void LoadData()
    {
        InitializeCommands();
    }
private void InitializeCommands()
    {
        ListSelectedCommand= new RelayCommand(()=>
        {
        });
    }

这背后的可能原因是什么。

命令不起作用的最可能原因应该是您没有正确绑定命令。由于代码段不是完整的,因此不正确的绑定可能是由多种原因引起的。这是我测试的一个小演示,可以在我这边工作,你可以参考。

XAML:

<telerikGrid:RadDataGrid ItemsSource="{x:Bind AvailableVM.PickListItems,Mode=OneWay}"
                 Background="White"
                 SelectionUnit="Cell"
                 GridLinesBrush="Pink"
                 AlternateRowBackground="Azure"
                 AutoGenerateColumns="False"
                 ScrollViewer.VerticalScrollBarVisibility="Hidden"
                x:Name="radgrid">
    <telerikGrid:RadDataGrid.Columns>
        <telerikGrid:DataGridTextColumn PropertyName="Country"/>
        <telerikGrid:DataGridTextColumn PropertyName="City"/>
        <telerikGrid:DataGridTemplateColumn Header="Assign"  SizeMode="Auto">
            <telerikGrid:DataGridTemplateColumn.CellContentTemplate>
                <DataTemplate x:DataType="local:DataTest">
                    <Button Background="Transparent"  Command="{x:Bind ListSelectedCommand }" Content="command testing" />
                </DataTemplate>
            </telerikGrid:DataGridTemplateColumn.CellContentTemplate>
        </telerikGrid:DataGridTemplateColumn>
    </telerikGrid:RadDataGrid.Columns> 
</telerikGrid:RadDataGrid>

代码隐藏:

public ViewModel AvailableVM { get; set; }
public MainPage()
{
    this.InitializeComponent();
    AvailableVM = new ViewModel(); 
}
public class ViewModel
{ 
    public void Testmethod()
    {
    }          
    public ObservableCollection<DataTest> PickListItems { get; set; }
    public ViewModel()
    {
        PickListItems = new ObservableCollection<DataTest>()
        {
            new DataTest { Country = "Brazil", City = "Caxias do Sul",  ListSelectedCommand = new RelayCommand(()=>{ })},
            new DataTest { Country = "Ghana", City = "Wa",  ListSelectedCommand = new RelayCommand(Testmethod)},
            new DataTest { Country = "Brazil", City = "Fortaleza"} 
        };
    }
}
public class DataTest
{
    public string City { get; set; }
    public string Country { get; set; }
    public ICommand ListSelectedCommand { get; set; }
}
class RelayCommand : ICommand
{
    public event EventHandler CanExecuteChanged;
    private Action _action;
    public RelayCommand(Action action)
    {
        this._action = action;
    }
    public bool CanExecute(object parameter)
    {
        return true;
    }
    public void Execute(object parameter)
    {
        this._action();
    }
}

顺便说一下,CellContentTemplate可能对绑定有影响。试图以上述方式绑定。此外,RadDataGrid有自己的命令,如果有适合您的场景,您可以参考。

最新更新