代码之家  ›  专栏  ›  技术社区  ›  AngryHacker

如何在Silverlight 3项目中刷新listbox.itemsSource?

  •  3
  • AngryHacker  · 技术社区  · 14 年前

    我的xaml,我定义了一个列表框

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

    在代码隐藏中,我定义了一个模块级的可观察采集设备。

    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 回复  |  直到 14 年前
        1
  •  4
  •   AnthonyWJones    14 年前

    听起来你好像失踪了 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       
     }
    

    这将使绑定到特定属性的文本块在属性更改时得到通知。