Как обновить ListBox.ItemsSource в проекте SilverLight 3? - PullRequest
3 голосов
/ 11 февраля 2010

Я мой XAML, у меня определен ListBox

<ListBox x:Name="lstStatus" Height="500" 
         Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" VerticalAlignment="Top" Margin="2, 2, 2, 2">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <Image />
                <TextBlock Width="70" Text="{Binding FriendlyID}" />
                <TextBlock Width="150" Text="{Binding StatusName}" />
                <TextBlock Width="70" Text="{Binding ANI}" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
    <ListBox.Effect>
        <DropShadowEffect/>
    </ListBox.Effect>
</ListBox>

В коде позади я определяю устройства ObservableCollection уровня модуля.

private ObservableCollection<Device> devices = new ObservableCollection<Device>();

В событии OnNavigatedToпривязать коллекцию к списку

lstStatus.ItemsSource = devices;

Скорее всего, коллекция не будет расти или уменьшаться, но объекты внутри себя все время меняются.По какой-то причине список не обновляется, когда я выполняю следующий код:

Device selectedDevice = null;
foreach (Device dv in devices)
{
    if (dv.IsTrunk)
    {
        selectedDevice = dv;
        break;
    }
}

if (selectedDevice != null)
    selectedDevice.StatusName = DateTime.Now.ToString();
else
    throw new Exception();

Фактически, единственный способ, которым я смог наполовину заставить его работать, - это подделать его, удалить элементыиз списка, а затем добавьте его обратно.Очевидно, что это не решение проблемы в долгосрочной перспективе.

Чего мне не хватает?

1 Ответ

4 голосов
/ 12 февраля 2010

Звучит так, как будто вам не хватает INotifyPropertyChanged реализации в Device объекте.

Например: -

 public class Device : INotifyPropertyChanged
 {
     private string _StatusName;
     public string StatusName
     {
         get { return _StatusName; }
         set
         {
             _StatusName = value;
             NotifyPropertyChanged("StatusName");
         }

     }

     private void NotifyPropertyChanged(string name)
     {
          if (PropertyChanged != null)
              PropertyChanged(this, new PropertyChangedEventArgs(name));
     }

     #region INotifyPropertyChanged Members

     public event PropertyChangedEventHandler PropertyChanged;

     #endregion       
 }

Это позволит TextBlocks, привязанным к конкретным свойствам, получать уведомления при изменении свойств.

...