Как можно визуально свернуть одну строку в ListBox Silverlight 4 без фактического удаления строки?
Работая в C# и Silverlight 4, я использую ListBox, связанный с источником данных. В настоящее время три элемента находятся в источнике данных и, таким образом, появляются в ListBox. Мне нужно, чтобы третий элемент не появлялся в ListBox, но все равно существовал бы по разным причинам.
Допустим, мой экземпляр ListBox называется myListBox.
По сути, я хотел бы иметь возможность сделать что-то вроде этого:
myListBox.Rows [2].Visibility = Visibility.Collapsed;
Возможно, мне следует задать более общий вопрос: "Как я могу получить доступ к отдельным строкам в ListBox и изменить свойства каждого?"
Спасибо.
1 ответ
Вы должны скрывать элементы в коллекции, к которой вы привязываете, а не сам элемент управления.
Используйте шаблон 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
стреляют по сеттерам и так далее. Вам также нужно будет связать IsVisible
свойство шаблона элемента для IsVisible
собственностью ElementVM
,