2017-10-16 12 views
0

Je développe une application UWP et j'ai besoin pour afficher les données dans le contrôle RadDataGrid de Telerik. Dans un scénario, j'ai besoin de montrer des données en utilisant TemplatedColumn et de lier des commandes aux contrôles placés dans son DataTemplate mais la commande ne se déclenche pas dans ViewModel mais quand j'attache un événement à ces contrôles, les événements sont déclenchés dans le code.Commande de reliure à TemplatedColumn dans RadDataGrid UWP

Voici le code:

<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> 

Voici le code ViewModel:

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

     }); 
    } 

Quelle pourrait être la raison possible derrière tout cela.

Répondre

0

La raison la plus possible pour la commande does't travail doit être vous ne liaient pas la commande correctement. Étant donné que votre extrait de code n'est pas complet, la liaison incorrecte peut être due à de nombreuses raisons. Voici une petite démo que j'ai testée et qui peut fonctionner de mon côté.

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> 
code

derrière:

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(); 
    } 
} 

Par ailleurs, le CellContentTemplate peut avoir une influence sur la liaison. Je ai essayé de lier sur la façon ci-dessus. En outre, le RadDataGrid a son propre commands, vous pouvez vous référer s'il y a un costume votre scénario.

+0

Merci @Soyez. J'ai trouvé la raison derrière cela. Voici le lien https://www.telerik.com/forums/what-is-the-correct-way-to-bind-a-command-on-button-in-template. –