您應該隱藏要綁定的集合中的元素,而不是控件本身。
利用MVVM pattern並將您的ListBox綁定到viewmodel中的可觀察集合。如果每個項目應該支持大量的定製,它可能是其他觀察模型的可觀察集合。然後使用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
上制定者開除等。您還需要將項目模板的IsVisible
屬性綁定到ElementVM
的IsVisible
屬性。
ListBox已經綁定到一個ObservableCollection。 (我正在修改舊的代碼,而不是開發新的代碼。)使用Remove方法從ObservableCollection中刪除元素會導致應用程序出現問題,但我沒有看到任何方法來簡單地隱藏/摺疊列表框中的元素或在ObservableCollection中。除了使其中一個項目在屏幕上消失而不在幕後消失之外,不需要特別定製。 – DaveInATL 2011-06-07 23:05:04
@DaveInATL:我加入到我的答案中,它仍然是一個非常原始的解決方案,但你可以得到的想法 – Dyppl 2011-06-07 23:22:49
Dyppl:我決定走在另一個方向。我從項目源中刪除了不想顯示的項目,然後在代碼中的幾個地方解決了這個問題。它運作良好。然而,我想要感謝你的時間和見解。戴夫 – DaveInATL 2011-06-09 16:16:47