2016-06-01 1 views
0

J'ai un UserControlBase avec une grille. La grille contient une colonne avec une action.ICommand ne fonctionne pas dans Silverlight Contrôle utilisateur

<sdk:DataGridTemplateColumn Header="Action"> 
    <sdk:DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <Button Style="{StaticResource DataGridButton}" Command="{Binding Source={StaticResource NewsViewModel}, Path=ModifyNewsCommand}" Content="Modify" /> 
      </StackPanel> 
     </DataTemplate> 
    </sdk:DataGridTemplateColumn.CellTemplate> 
</sdk:DataGridTemplateColumn> 

Mon problème est avec mon Command. Il me lance Erreur technique qui est mon premier problème, je ne sais pas comment faire de cette application me jeter le vrai message d'erreur.

Dans le code derrière de mon contrôle utilisateur J'enregistré les événements:

protected void RegisterMessages() 
{ 
    Messenger.Default.Register<string>(this, "NewNewsBtn_Click", NewNewsBtn_Click); 
    Messenger.Default.Register<string>(this, "ModifyNewsBtn_Click", ModifyNewsBtn_Click); 
} 

Et dans mon constructeur:

public NewsWindow(int underlyingId) 
{ 
    InitializeComponent(); 
    this.RegisterMessages(); 
    viewModel = new NewsViewModel(underlyingId); 
    ucNewsPanel.DataContext = viewModel; 
} 

Mon modèle de vue (NewsViewModel)

public ICommand ModifyNewsCommand 
{ 
    get 
    { 
     return new RelayCommand<string>(e => 
     { 
      Messenger.Default.Send(string.Empty, "ModifyNewsBtn_Click"); 
     }); 
    } 
} 

Quoi de neuf bizarre ici est que mon NewNewsBtn fonctionne, alors que mon ModifyNewsBtn n'est pas.

Ce bouton est en dehors de la grille, donc cela peut faire une différence sur pourquoi il fonctionne.

<Button x:Name="NewNewsBtn" MaxHeight="50" MaxWidth="100" Command="{Binding Path=NewNewsCommand}" Content="Add New" /> 
+0

Pourquoi utilisez-vous un StaticResource dans votre liaison au lieu d'accéder au DataContext? Il me semble que c'est la cause de votre bouton ne fonctionne pas. – Martin

+0

Je suppose que cette partie est erronée ** Command = "{Source de liaison = {StaticResource NewsViewModel}, Path = ModifyNewsCommand}" ** – ViVi

+0

@Martin - Si vous supprimez la StaticResource et laissez simplement le chemin, cela ne fonctionne pas. Il ne me jette pas d'erreur mais il n'entre pas dans la méthode. –

Répondre

1

Votre DataGrid sera lié à une collection, avec une ligne par élément. Maintenant, l'élément est le DataContext d'une ligne. Ce que vous devez faire est de lier votre bouton "Modifier" au DataContext parent. Si vous utilisez silverlight5 vous pouvez utiliser un AncestorBinding:

<Button 
    Content="Modify" 
    Command="{Binding 
     Path=DataContext.ModifyNewsCommand, 
     RelativeSource={RelativeSource AncestorType=UserControl}}"/> 
+0

Ça a marché! Merci beaucoup! –

0

Votre syntaxe semble correct:

<Button Style="{StaticResource DataGridButton}" Content="Modify" 
    Command="{Binding Source={StaticResource NewsViewModel}, Path=ModifyNewsCommand}"/> 

Mais vous définissez votre viewmodel dans le code. Ai-je raison de créer StaticResource en XAML? Si c'est le cas, il suffit de supprimer le paramètre DataContext de code-behind car la ligne suivante Command="{Binding Source={StaticResource NewsViewModel}, Path=ModifyNewsCommand}" verra dans l'autre instance de votre viewModel. (Parce que vous avez créer deux instances de NewsViewModel comme StaticResource et code-behind)

Mise à jour:
Je avais besoin DataContext dans le code derrière que je passe un paramètre à mon modèle de vue. De toute façon je peux le faire si je l'ai retiré du code derrière?
Ensuite, vous devez supprimer StaticResource de liaison de Command:

<Button Style="{StaticResource DataGridButton}" Command="{Binding ModifyNewsCommand}" 
                    Content="Modify"/> 

Parce que vous faites référence à une autre instance de NewsViewModel.

+0

J'avais besoin du 'DataContext' dans le code car je passe un paramètre à mon modèle de vue. De toute façon je peux le faire si je l'ai retiré du code derrière? –

+0

@GeraldGonzales s'il vous plaît, voir ma réponse mise à jour – StepUp

+0

la réponse mise à jour ne fonctionnera pas. Il ne peut pas trouver le modèle de vue. –