2009-03-19 8 views
0

J'essaie de sélectionner l'une des trois zones de liste d'une (quatrième) zone de liste de sources. La source a une liste de sujets scolaires qui sont classés comme des matières élémentaires, intermédiaires ou secondaires. La liste de sources est une liste de cases à cocher. L'utilisateur clique sur la case à cocher et l'un des trois autres vise à obtenir une copie de l'objet Subject de la liste source. J'ai branché le truc et réussi à frapper une méthode CheckBox_Changed. Je peux localiser avec succès l'instance Subject de la liste source et l'ajouter au tableau Source de la liste cible.Mise à jour des listes SilverLight lorsque la collection en mémoire Bound reçoit un nouveau membre

Ce que je ne peux pas faire est d'afficher la mise à jour sur le contrôle Silverlight auquel le tableau cible est lié.

Des idées?

Merci

private void CheckBox_Checked(object sender, RoutedEventArgs e) 
{ 
    var cb = (CheckBox)sender; 
    var children = ((Grid)cb.Parent).Children; 
    // cb has a sibling TextBlock item that has the index of the item in 
    // the list of subjects 
    var ch2 = children[1] as TextBlock; 
    var subjectIndexStr = ch2.Text; 
    var myWorkingSubject = workingSubjectList[int.Parse(subjectIndexStr)]; 

    switch (myWorkingSubject.SubjectLevelId) 
    { 
// updates to the elementarySubjects, middleSubjects and highSubjects 
// don't get reflected in the lists that use them as a resource. 
    case (int)SubjectLevels.Elementary: 
     elementarySubjects.Add(myWorkingSubject); 
     break; 
    case (int)SubjectLevels.Middle: 
     middleSubjects.Add(myWorkingSubject); 
     break; 
    case (int)SubjectLevels.High: 
     highSubjects.Add(myWorkingSubject); 
     break; 
    default: break; 

    } 
} 

// this is how the target classes are declared. 
public class SubjectsElementary : ObservableCollection<WorkingSubject> 
{ 
} 
public class SubjectsMiddle : ObservableCollection<WorkingSubject> 
{ 
} 
public class SubjectsHigh : ObservableCollection<WorkingSubject> 
{ 
} 

Voici les extraits du fichier XAML

<TutorRouterSvc:WorkingSubjectList x:Key="subjects" /> 
<TutorRouterSvc:SubjectsElementary x:Key="elementarySubjects" /> 
<TutorRouterSvc:SubjectsMiddle x:Key="middleSubjects" /> 
<TutorRouterSvc:SubjectsHigh x:Key="highSubjects" /> 


    <ListBox x:Name="subjectList" ItemsSource="{Binding Mode=OneWay, Source={StaticResource subjects}}"> 

    <ListBox.Resources> 

    </ListBox.Resources> 
     <ListBox.ItemTemplate> 
      <StaticResource ResourceKey="DataSubjectsTemplate1"/> 
     </ListBox.ItemTemplate> 
    </ListBox> 

<Grid Grid.Column="1"> 
    <Grid.RowDefinitions> 
    <RowDefinition Height="*"/> 
    <RowDefinition Height="*"/> 
    <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 

    <ListBox Margin="0,0,8,0" x:Name="elementarySubjectList" 
      ItemsSource="{Binding Mode=OneWay, Source={StaticResource elementarySubjects}}" 
      Background="#FFE75151" Grid.Row="0"> 
    <ListBox.ItemTemplate> 
     <StaticResource ResourceKey="DataSubjectsTemplate1"/> 
    </ListBox.ItemTemplate> 
    </ListBox> 
    <ListBox Margin="0,0,8,0" x:Name="middleSubjectList" 
      ItemsSource="{Binding Mode=OneWay, Source={StaticResource middleSubjects}}" 
      Background="#FFE75151" Grid.Row="1"> 
    <ListBox.ItemTemplate> 
     <StaticResource ResourceKey="DataSubjectsTemplate1"/> 
    </ListBox.ItemTemplate> 
    </ListBox> 
    <ListBox Margin="0,0,8,0" x:Name="highSubjectList" 
      ItemsSource="{Binding Mode=OneWay, Source={StaticResource highSubjects}}" 
      Background="#FFE75151" Grid.Row="1"> 
    <ListBox.ItemTemplate> 
     <StaticResource ResourceKey="DataSubjectsTemplate1"/> 
    </ListBox.ItemTemplate> 
    </ListBox> 
</Grid> 

Répondre

0

Je ne suis pas tout à fait sûr, mais cela peut être fixable en faisant les changements à l'intérieur d'un Dispatch.BeginInvoke().

Vous pouvez factoriser l'instruction de passer à une nouvelle méthode appelée UpdateListBox, puis l'appeler:

Dispatcher.BeginInvoke(() => UpdateListBox(myWorkingSubject.SubjectLevelId)) 
+0

Merci pour la réponse. Je ne peux pas dire que je comprends ce que le Dispatcher.BeginInvoke() fait sauf initier un deligate sur une file d'attente. Je pensais qu'il suffirait d'ajouter un nouvel élément à la collection de données liées. Que ferait UpdateListBox() pour mettre à jour le ListBox? – Weej

0

Peut-être que ce qui se passe parce que le XAML est Newing une nouvelle instance de vos objets, dont il est databinding à. Essayez d'ajouter ceci au cosntructor sur votre Page.xaml.cs (ou là où se trouve le contrôle);

_subjects = Resources["subjects"] as WorkingSubjectsList; 
_elementarySubjects = Resources["elementarySubjects"] as SubjectsElementary; 

etc ...

Peut-être que vous aidera. J'ai implémenté le même concept en liant des listboxes à des collections Observable à plusieurs occasions et n'ai pas expérimenté ce que vous rencontrez.

J'ai quelques suggestions: Avez-vous essayé cette expérience sur votre événement check changed?

workingsubject _item = workingSubjectList[subjectsList.selectedindex]; 
switch (_item.SubjectLevel) //I'm assuming this property as you have the ID and it looks to be an enumeration 
     { 
      case Elementary: 
       elementarySubjects.Add(_item): 
       break; 
      case Middle: 
       middleSubjects.Add(_item): 
       break; 
      case High: 
       highSubjects.Add(_item): 
       break; 
       case default: 
         throw new Exception("Unrecognized Subject Level"); 
     } 

hth.

Questions connexes