2009-10-04 8 views
2

Salut à tous je suis tombé sur un problème avec les cases à cocher dans le DataGrid.Silverlight Case à cocher à l'intérieur de la grille de données causant des problèmes

Tout d'abord laissez-moi poster mon code de ce que j'ai atteint et je vais dire ce qui cause le problème

Voici le code de mon DataGrid dans une fenêtre enfant

<Controls:DataGrid x:Name="dgAthlete" Height="Auto" Width="Auto" 
             IsReadOnly="True" AutoGenerateColumns="False" 
             HorizontalAlignment="Stretch" 
             HorizontalScrollBarVisibility="Disabled" 
             ItemsSource="{Binding Data, ElementName=dds}" 
            > 
      <Controls:DataGrid.Columns> 
       <Controls:DataGridTemplateColumn Header="CheckBoxColumn"> 
        <Controls:DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <CheckBox x:Name="cbAddAthlete" IsChecked="{Binding IsAdded}" Tag="{Binding}" 
          IsEnabled="True" Checked="cbAddAthlete_Checked" Unchecked="cbAddAthlete_Unchecked" /> 
         </DataTemplate> 
        </Controls:DataGridTemplateColumn.CellTemplate> 
        <Controls:DataGridTemplateColumn.CellEditingTemplate> 
         <DataTemplate> 
          <CheckBox IsChecked="{Binding Path=IsAdded,Mode=TwoWay}"/> 
         </DataTemplate> 
        </Controls:DataGridTemplateColumn.CellEditingTemplate> 
       </Controls:DataGridTemplateColumn> 



       <Controls:DataGridTemplateColumn> 
        <Controls:DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <Image Source="{Binding ImageFileName}" 
               Width="25" Height="25" 
               HorizontalAlignment="Stretch" /> 
         </DataTemplate> 
        </Controls:DataGridTemplateColumn.CellTemplate> 
       </Controls:DataGridTemplateColumn> 
       <Controls:DataGridTextColumn Header="FirstName" Binding="{Binding FirstName}" /> 
       <Controls:DataGridTextColumn Header="MiddleName" Binding="{Binding MiddleName}"/> 
       <Controls:DataGridTextColumn Header="LastName" Binding="{Binding LastName}"/> 
       <Controls:DataGridTextColumn Header="Email" Binding="{Binding Email}" /> 
       <Controls:DataGridTextColumn Header="DOB" Binding="{Binding BirthDate}"/> 
       <Controls:DataGridTextColumn Header="Phone" Binding="{Binding PhoneNumber}"/> 
       <Controls:DataGridTextColumn Header="Website" Binding="{Binding WebSite}"/> 
       <Controls:DataGridTextColumn Header="Team" Binding="{Binding TeamName}"/> 
       <Controls:DataGridTextColumn Header="Club" Binding="{Binding ClubName}"/> 
       <Controls:DataGridTextColumn Header="County" Binding="{Binding CountyName}"/> 
      </Controls:DataGrid.Columns> 
     </Controls:DataGrid> 
     <Controls:DataPager x:Name="dpAthlete" PageSize="4" 
       HorizontalAlignment="Stretch" Source="{Binding Data, ElementName=dds}" 
       Width="Auto"/> 
    </StackPanel> 
    <Button x:Name="CancelButton" Content="Cancel" Click="CancelButton_Click" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,12,0,0" Grid.Row="1" /> 
    <Button x:Name="OKButton" Content="OK" Click="OKButton_Click" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,12,79,0" Grid.Row="1" /> 

Le code derrière pour c'est

public partial class AddAthletesToCompetition : ChildWindow 
{ 
    public ObservableCollection<Athlete> Athletes { get; set; } 
    public int CompetitionId { get; set; } 
    private PagedCollectionView pvcAthlete; 

    public AddAthletesToCompetition(int competitionId) 
    { 
     InitializeComponent(); 
     CompetitionId = competitionId; 
     LoadAthlete(); 
     Athletes = new ObservableCollection<Athlete>(); 

    } 

    private void OKButton_Click(object sender, RoutedEventArgs e) 
    { 
     this.DialogResult = true; 
    } 

    private void CancelButton_Click(object sender, RoutedEventArgs e) 
    { 
     this.DialogResult = false; 
    } 
    private void LoadAthlete() 
    { 
     var context = new PublicServiceClient(); 
     context.GetAthletesNotInCompetitionCompleted += context_GetAthletesNotInCompetitionCompleted; 
     context.GetAthletesNotInCompetitionAsync(CompetitionId); 
    } 

    void context_GetAthletesNotInCompetitionCompleted(object sender, GetAthletesNotInCompetitionCompletedEventArgs e) 
    { 
     if (e.Result != null) 
     { 
      pvcAthlete = new PagedCollectionView(e.Result.ToList()); 
      dgAthlete.ItemsSource = pvcAthlete; 
      dpAthlete.Source = pvcAthlete; 
     } 
    } 


    //Checkbox Checked Event Hanlder 
    private void cbAddAthlete_Checked(object sender, RoutedEventArgs e) 
    { 
     var athlete = ((CheckBox)sender).Tag as AthleteBO; 
     if (athlete != null) 
     { 
      var ath = new Athlete(); 
      ath.AthleteId = athlete.AthleteId; 
      Athletes.Add(ath); 
     } 
    } 


    //CheckBox unchecked Event Handler 
    private void cbAddAthlete_Unchecked(object sender, RoutedEventArgs e) 
    { 
     var athlete = ((CheckBox)sender).Tag as AthleteBO; 
     if (athlete != null) 
     { 
      var item = Athletes.First(i => i.AthleteId == athlete.AthleteId); 
      Athletes.Remove(item); 
     } 
    } 

} 

Comme vous pouvez le voir je suis en utilisant tout pagination fonctionne très bien check-à-dire et les événements décocher pour le travail de case à cocher bien quand nous sommes sur la première page, mais disons que vous avez coché le premier et le deuxième élément de la grille sur la première page, maintenant dès que je passe à la page suivante ce que ma grille fait en conservant la vue précédente et en vérifiant par défaut le premier et le deuxième élément sur le deuxième page qui n'est pas attendue comportement

Je suis passé par divers messages sur ce problème et j'ai constaté que le problème est que la vue est injectée par la grille de données, mais je n'ai pas trouvé de solution.

Ce dont on parlait était de rafraîchir la collection observable et de la relier à ma grille.

Donc, j'étais un peu confus comme où lier cela et quand mettre à jour la collection observable.

J'ai posté tout le code et chaque fois que vous répondez s'il vous plaît mentionner où exactement devrais-je faire les changements pour que cela fonctionne.

Pour une note j'utilise WCF et EF, donc la liste des athlètes que j'ai ici je vais envoyer cette liste au service WCF où en utilisant EF il sera inséré dans la base de données. Je sais que ce n'est pas un bug dans Silverlight mais cette fonctionnalité supplémentaire de la virtualisation de la grille me cause actuellement des problèmes donc il devrait y avoir aussi une solution à ce problème.

Merci

+0

Avez-vous déjà trouver un solution pour cela? – SideFX

Répondre

0

Ajouter une propriété bool IsSelected à votre entité et lier le contrôle de case à cocher à elle. Cet exemple de code semble que vous utilisez les services .NET RIA et le contrôle DomainDataSource (ItemsSource = "{Binding Data, ElementName = dds}"), pas WCF? J'ai utilisé cette solution avec WCF, mais pas dans une configuration paginée. Essayez-le et laissez-nous savoir comment il se trouve,

0

je lient mon combobox mais était encore en train de le problème, jusqu'à ce que je commencé à utiliser deux voies de liaison, semble être allé maintenant

Questions connexes