listBox.ItemContainerGenerator.ContainerFromItem()将null返回到列表框中添加的NEW项

时间:2011-11-08 05:27:04

标签: wpf

这是我在这里的第一篇文章,所以我希望你能帮助我解决有关WPF的问题。

我有一个与ObservableCollection绑定的列表框:

    public ObservableCollection<DeviceSetting> DeviceSettings
                {
                    get { return _deviceSettings; }
                    set { _deviceSettings = value; }
                }

   <ListBox ItemTemplate="{StaticResource IPItemTemplate}" Name="listBoxAddresses" SelectionMode="Extended" ItemsSource="{Binding Path=TestSetting.DeviceSettings, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"
     ItemContainerStyle="{StaticResource ContainerStyle}" />

这里的情况是,我想知道是否有新项目添加到列表中,所以我做的是创建一个CollectionChanged事件:

TestSetting.DeviceSettings.CollectionChanged += mListBox_CollectionChanged;  

private void mListBox_CollectionChanged(object sender,NotifyCollectionChangedEventArgs e)
{
   if (e.Action == NotifyCollectionChangedAction.Add)
   {
       for (int i = 0; i < TestSetting.DeviceSettings.Count; i++){

       ListBoxItem myListBoxItem = (ListBoxItem)(listBoxAddresses.ItemContainerGenerator.ContainerFromItem(listBoxAddresses.Items[i]));


        if (!TestSetting.DeviceSettings[i].IsNetwork && DeviceDiscovery.IsSelected)
                  myListBoxItem.IsEnabled = false;

        else if (TestSetting.DeviceSettings[i].IsNetwork && !DeviceDiscovery.IsSelected)
                  myListBoxItem.IsEnabled = false;
        else
                  myListBoxItem.IsEnabled = true;

     }
 }

但是这个陈述出现了问题:

ListBoxItem myListBoxItem = (ListBoxItem)(listBoxAddresses.ItemContainerGenerator.ContainerFromItem(listBoxAddresses.Items[i]));

每次我添加一个新项目时,上面的语句总是返回null,因此如果要启用,则不会检查添加的新项目。有没有办法让这个语句返回我需要的正确ListBoxItem?

3 个答案:

答案 0 :(得分:7)

您正在处理基础集合CollectionChanged事件。仅仅因为集合已更改并不意味着项目已呈现且UIElement已准备好。

注册ItemsGenerator.StatusChanged事件,该事件应保证UIElement准备就绪。

答案 1 :(得分:0)

我在Windows Phone中找不到ItemsGenerator.StatusChanged事件,但它适用于listBoxAddresses.LayoutUpdated

我还必须确保myListBoxItem与null不同。

答案 2 :(得分:0)

如果您正在加载控件并尝试访问...

ItemContainerGenerator.ContainerFromItem(object here)

我能够在ListBox.Loaded事件中解决这个问题。例如

SourceColumnListBox.Loaded += SourceColumnListBox_Loaded;

然后在SourceColumnListBox_Loaded处理程序中,一切正常。