Обновление списков SilverLight, когда связанная коллекция в памяти получает нового члена

Я пытаюсь собрать один из трех списков из (четвертого) списка источников. В источнике есть список школьных предметов, которые классифицируются как предметы начальной, средней и старшей школы. Список источников - это список флажков. Пользователь щелкает по флажку, и один из трех других предназначен для получения копии объекта Subject из исходного списка. Я подключил штуку и успешно нажал на метод CheckBox_Changed. Я могу успешно найти экземпляр Subject в исходном списке и добавить его в исходный массив целевого списка.

Я не могу показать обновление элемента управления Silverlight, к которому привязан целевой массив.

Любые идеи?

Спасибо

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

Вот фрагменты из файла .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>

person Weej    schedule 19.03.2009    source источник


Ответы (2)


Я не совсем уверен, но это можно исправить, внеся изменения в Dispatch.BeginInvoke ().

Вы можете преобразовать оператор switch в новый метод с именем UpdateListBox, а затем вызвать его:

Dispatcher.BeginInvoke(() => UpdateListBox(myWorkingSubject.SubjectLevelId))
person Glen Little    schedule 19.03.2009
comment
Спасибо за ответ. Я не могу сказать, что понимаю, что делает Dispatcher.BeginInvoke (), за исключением того, что инициирует deligate в очереди. Я думал, что достаточно просто добавить новый элемент в коллекцию связанных данных. Что сделает UpdateListBox () для обновления ListBox? - person Weej; 19.03.2009

Возможно, это происходит потому, что XAML создает новый экземпляр ваших объектов, к которым он привязан.

Попробуйте добавить это в коснструктор на вашем Page.xaml.cs (или где бы то ни было, где находится элемент управления);

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

и т.д...

Может, это поможет. Я реализовал ту же концепцию, привязывая списки к коллекциям Observable несколько раз, и я не испытывал того, с чем вы сталкиваетесь.

У меня есть пара предложений: пробовали ли вы это в событии изменения чека?

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.

person Community    schedule 27.03.2009