这是我在这里的第一篇文章,所以我希望你能帮助我解决有关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?
答案 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处理程序中,一切正常。