У меня есть странная проблема с ListBox: Я вразумлял его коллекции, которая не реализует INotifyCollectionChanged (не представляется возможным, поскольку это элементы генерируются динамически по запросу):Listbox не обновляет содержимое ItemsSource
IEnumerator IEnumerable.GetEnumerator()
{
foreach (var metaData in Metadata.Where((m) => m.IsEnabled))
{
yield return new DynamicPropertyValue(this, metaData);
}
}
Поэтому, когда IsVisible изменений ListBox, я пытаюсь заставить обновить ItemsSource, установив его на нуль, а затем обновить связывание:
static void ItemsControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
if (true.Equals(e.NewValue))
{
var element = (ItemsControl)sender;
var bindingExpression = BindingOperations.GetBindingExpression(element, ItemsControl.ItemsSourceProperty);
if (bindingExpression != null)
{
element.SetCurrentValue(ItemsControl.ItemsSourceProperty, null);
bindingExpression.UpdateTarget();
var count = element.ItemsSource.OfType<object>().Count();
if (count != element.Items.Count)
{
Debug.WriteLine("Wrong number of items");
}
}
}
}
когда ItemsSource установлено значение Null, то ItemsControl делает не содержать любые предметы больше и коллекция предметов empt, как и ожидалось. Однако при повторном применении привязки восстанавливаются все старые элементы. Коллекция Items содержит те же экземпляры, что и раньше. Вызывается метод GetEnumerator, но новые элементы игнорируются.
Я не понимаю, почему это так, или как я могу избежать того, что ItemsControl кэширует его элементы.
Alex
Почему бы вам просто не создать новую коллекцию и не присвоить ее свойству ItemSource? – Clemens
'element.SetCurrentValue (ItemsControl.ItemsSourceProperty, null);' Я считаю, что это установит ваш 'ItemsControl.ItemSource' в' null', где ваш код обновит коллекцию? – Bolu
Коллекцию можно разделить на несколько (несвязанных) объектов. Когда я заменю его на одном месте, мне придется его заменять повсюду. Но у меня нет доступа ко всем этим местам. – LionAM