2010-09-22 7 views
0

J'ai un problème avec les StackPanels imbriqués. Si je définis StackPanels comme dans le code ci-dessous, le bouton se lie à la commande (MVVM et le modèle de commande) mais ne réagit pas au clic du bouton (la fonction de commande n'est pas appelée). Quand je mets stackPanel4 en deuxième position (ci-dessous stackPanel3) tout fonctionne bien. Lorsque je déplace stackPanel4 sur la dernière position (j'ai plus de StackPanels puis deux StackPanel parent internes), le bouton n'est pas lié et la fonction de commande n'est pas appelée. Quelle pourrait être une raison pour ce comportement? Si je définis DataContext pour stackPanel4 cela fonctionne bien.Problème avec les StackPanels imbriqués et l'héritage DataContext dans Silverlight 4

<StackPanel DataContext="{StaticResource vmUserMasterData}" Grid.Column="1" Height="320" HorizontalAlignment="Left" Margin="4,6,4,0" Name="stackPanel1" VerticalAlignment="Top" Width="491"> 
     <StackPanel Height="40" Name="stackPanel4" Orientation="Horizontal" Width="440"> 
      <Button Content="Update User Data" Name="button1" Height="23" Width="440" Command="{Binding Path=UpdateDataCommand}"/> 
     </StackPanel> 
     <StackPanel Height="31" Name="stackPanel3" Orientation="Horizontal" Width="440"> 
      <sdk:Label Content="Username" Height="28" Name="label2" Width="74" /> 
      <TextBox Height="23" Name="textBox2" Width="365" Text="{Binding Username, Mode=OneWay}" /> 
     </StackPanel> 
    </StackPanel> 
+0

Quand vous dites ci-dessous StackPanel3, voulez-vous dire imbriquées à l'intérieur ou physiquement sous la balise de fermeture de StackPanl3? – Ben

+0

Je veux dire physiquement sous l'étiquette de fermeture de StackPanel3. – Aleksandar

Répondre

0

Il doit y avoir plus à ce problème. Nous avons reproduit votre configuration et l'événement de commande se déclenche à chaque fois, indépendamment de l'ordre des StackPanels (comme vous le penseriez).

Pouvez-vous fournir une source à partir de votre ViewModel (en particulier en ce qui concerne la façon dont la commande est créée/utilisée)? La description du code XAML, pour le cas qui échoue, n'est pas claire. Pouvez-vous fournir une copie exacte du Xaml quand il ne tire pas? Ce pourrait être une combinaison spécifique de panneaux que vous avez sur votre machine. Une mauvaise fermeture et cela échouerait (par exemple si elle tombait en dehors de stackPanel1 par accident).

Notre reproduction (qui fonctionne indépendamment de l'ordre du panneau):

Xaml:

<UserControl.Resources> 
    <SilverlightApplication1:ViewModel x:Key="vmUserMasterData"/> 
</UserControl.Resources> 
    <Grid x:Name="LayoutRoot"> 
     <StackPanel DataContext="{StaticResource vmUserMasterData}" Grid.Column="1" Height="320" HorizontalAlignment="Left" Margin="4,6,4,0" Name="stackPanel1" VerticalAlignment="Top" Width="491"> 
      <StackPanel Height="31" Name="stackPanel3" Orientation="Horizontal" Width="440"> 
       <sdk:Label Content="Username" Height="28" Name="label2" Width="74" /> 
       <TextBox Height="23" Name="textBox2" Width="365" Text="{Binding Username, Mode=OneWay}" /> 
      </StackPanel> 
     <StackPanel Height="40" Name="stackPanel4" Orientation="Horizontal" Width="440"> 
      <Button Content="Update User Data" Name="button1" Height="23" Width="440" Command="{Binding Path=UpdateDataCommand}"/> 
     </StackPanel> 
    </StackPanel> 
    </Grid> 

Code ViewModel:

using System.Windows.Input; 
using Microsoft.Practices.Prism.Commands; 

namespace SilverlightApplication1 
{ 
    public class ViewModel 
    { 
     public ICommand UpdateDataCommand { get; set; } 
     public string Username { get; set; } 

     public ViewModel() 
     { 
      Username = "Woof!"; 
      UpdateDataCommand = new DelegateCommand<string>(
       (x) => 
       { 
        int dog = 1; // breakpoint here 
       }); 
     } 
    } 
} 
+0

stackPanel1 est à l'intérieur de la grille et fait partie du contrôle ChildWindow. – Aleksandar

+0

Merci pour votre réponse. Ce sont des données supplémentaires: stackPanel1 est à l'intérieur de la grille et cela fait partie du contrôle ChildWindow. Aussi: < locales: ViewModelExample x: key = "vmExample" />< locales: ViewModelUserMasterData x: Key = "vmUserMasterData" /> vmExample n'est pas utilisé dans ces stackPanels. Pour le modèle de commande, j'ai utilisé un modèle similaire au modèle RelayCommand de Josh Smith. Il n'y a pas de problème avec la fermeture des tags ou similaire. Tout semble bien dans l'exécution; le seul problème est avec la liaison. – Aleksandar

+0

@Aleksandar: J'ai posté notre échantillon "réduit au minimum" pour que vous puissiez l'examiner. Espérons que quelque chose vous arrivera, dans votre propre code, pour que vous essayiez. Nous ne pouvons pas faire beaucoup plus sans code complet à ce stade car nous ne pouvons pas reprocher le problème. –