Как можно явно свернуть одну строку в ListBox Silverlight 4 без фактического удаления строки? - PullRequest
0 голосов
/ 08 июня 2011

Работая в C # и Silverlight 4, я использую ListBox, связанный с источником данных.В настоящее время три элемента находятся в источнике данных и, таким образом, появляются в ListBox.Мне нужно, чтобы третий элемент не появлялся в ListBox, но все равно существовал бы по разным причинам.

Допустим, мой экземпляр ListBox называется myListBox.

По сути, я бы хотел иметь возможностьсделать что-то вроде этого:

myListBox.Rows [2] .Visibility = Visibility.Collapsed;

Возможно, мне следует задать более общий вопрос: «Как я могу получить доступ к отдельным строкам?в ListBox и изменить свойства каждого? "

Спасибо.

1 Ответ

0 голосов
/ 08 июня 2011

Вы должны скрывать элементы в коллекции, к которой вы привязываете, а не сам элемент управления.

Используйте шаблон 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.

...