这是我在这里的第一篇文章,所以我希望你能帮助我解决有关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}" />
Run Code Online (Sandbox Code Playgroud)
这里的情况是,我想知道是否有新项目添加到列表中,所以我做的是创建一个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;
}
}
Run Code Online (Sandbox Code Playgroud)
但是在这个声明中出现了一个问题:
ListBoxItem myListBoxItem = (ListBoxItem)(listBoxAddresses.ItemContainerGenerator.ContainerFromItem(listBoxAddresses.Items[i]));
Run Code Online (Sandbox Code Playgroud)
每次我添加一个新项时,上面的语句总是返回null,因此如果启用或不启用,则不会检查添加的新项.有没有办法让这个语句返回我需要的正确ListBoxItem?
您正在处理基础集合CollectionChanged事件.仅仅因为集合被更改并不意味着该项目已经渲染并且UIElement已经准备就绪.
注册参加ItemsGenerator.StatusChanged活动,保证UIElement准备就绪.
| 归档时间: |
|
| 查看次数: |
2935 次 |
| 最近记录: |