Как можно визуально свернуть одну строку в 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,

Другие вопросы по тегам