您应该隐藏要绑定的集合中的元素,而不是控件本身。
利用MVVM 模式并将您的 ListBox 绑定到视图模型中的可观察集合。如果每个项目都应该支持大量定制,它可能是其他视图模型的可观察集合。然后使用列表框变得像使用 C# 集合一样简单 - 您可以执行任何删除/添加/隐藏逻辑而不会弄乱控件本身。
编辑:
这是解决方案的想法:您绑定到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
在 setter 上触发它等等。您还需要将IsVisible
项目模板的IsVisible
属性绑定到ElementVM
.