Вы должны скрывать элементы в коллекции, к которой вы привязываете, а не сам элемент управления.
Используйте шаблон MVVM и привяжите свой ListBox к наблюдаемой коллекции в вашей модели представления. Это может быть наблюдаемая коллекция других моделей просмотра, если каждый элемент должен поддерживать множество настроек. Тогда работа со списком становится такой же простой, как и работа с коллекциями C # - вы можете выполнять любую логику удаления / добавления / скрытия, не вмешиваясь в сам элемент управления.
Edit:
Вот идея решения: вы привязываете к полю ElementsVM
, а не к полю Elements
. Поле Elements
используется для установки модели для этого экземпляра класса VM. Позже, когда вам нужно скрыть / показать элемент, используйте что-то вроде _elementsVM[0].Visibility = Visibility.Collapsed
.
private ObservableCollection<Element> _elements;
public ObservableCollection Elements {
get { return _elements; }
set {
_elements = value;
var VMs = _elements.Select(el => new ElementVM(el, Visibility.Visible);
_elementsVM = new ObservableCollection<ElementVM>(VMs);
//NotifyPropertyChanged ("ElementVM")
}
}
privae ObserableCollection<ElementVM> _elementsVM;
public ObservableCollection ElementsVM {
get { return _elementsVM; }
}
public class ElementVM: INotifyPropertyChanged {
public Element Element { get; set; }
public Visibility IsVisible { get; set; }
public ElementVM (Element element, Visibility visibility) {
Element = element;
IsVisible = visibility;
}
// Implement INotifyPropertyChanged here
}
Вам придется немного поработать над моей реализацией ElementVM
: убедитесь, что PropertyChanged
запущен на сеттерах и так далее. Вам также необходимо привязать свойство IsVisible
шаблона элемента к свойству IsVisible
ElementVM
.