2017-10-16 120 views
0

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

下面是代码:

<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(()=> 
     { 

     }); 
    } 

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

回答

0

该命令的最可能的原因不起作用应该是你没有正确绑定命令。由于你的代码片段不是完整的,不正确的绑定可能是由许多原因造成的。这里是我测试过的一个小型演示,可以在您参考的一面工作。

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有自己的commands如果有一个适合你的场景,你可以参考。

+0

谢谢@Sunteen。我发现这背后的原因。这里是Link https://www.telerik.com/forums/what-is-the-correct-way-to-bind-a-command-on-button-in-template。 –