2011-06-07 51 views
0

在C#和Silverlight 4中工作時,我使用綁定到數據源的ListBox。此時有三個項目在數據源中,因此出現在列表框中。我需要第三項不會出現在列表框中,但由於各種原因仍然存在。如何在Silverlight 4 ListBox中顯式摺疊單行而不實際刪除行?

假設我的ListBox實例被稱爲myListBox。

基本上想什麼,我能夠做的就是這樣的事情:

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

也許我應該問的一個更一般的問題是:「我如何訪問ListBox中的單個行並更改每個行的屬性?」

謝謝。

回答

0

您應該隱藏要綁定的集合中的元素,而不是控件本身。

利用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屬性綁定到ElementVMIsVisible屬性。

+0

ListBox已經綁定到一個ObservableCollection。 (我正在修改舊的代碼,而不是開發新的代碼。)使用Remove方法從ObservableCollection中刪除元素會導致應用程序出現問題,但我沒有看到任何方法來簡單地隱藏/摺疊列表框中的元素或在ObservableCollection中。除了使其中一個項目在屏幕上消失而不在幕後消失之外,不需要特別定製。 – DaveInATL 2011-06-07 23:05:04

+0

@DaveInATL:我加入到我的答案中,它仍然是一個非常原始的解決方案,但你可以得到的想法 – Dyppl 2011-06-07 23:22:49

+0

Dyppl:我決定走在另一個方向。我從項目源中刪除了不想顯示的項目,然後在代碼中的幾個地方解決了這個問題。它運作良好。然而,我想要感謝你的時間和見解。戴夫 – DaveInATL 2011-06-09 16:16:47