如何在不实际删除行的情况下明显折叠 Silverlight 4 ListBox 中的单行?
Posted
技术标签:
【中文标题】如何在不实际删除行的情况下明显折叠 Silverlight 4 ListBox 中的单行?【英文标题】:How can I visibly collapse a single row in a Silverlight 4 ListBox without actually removing the row? 【发布时间】:2011-09-10 11:25:13 【问题描述】:在 C# 和 Silverlight 4 中工作时,我正在使用绑定到数据源的 ListBox。此时三个项目在数据源中,因此出现在 ListBox 中。我需要第三项不出现在 ListBox 中,但由于各种原因仍然存在。
假设我的 ListBox 实例名为 myListBox。
基本上我想做的是这样的:
myListBox.Rows[2].Visibility = Visibility.Collapsed;
也许我应该问一个更普遍的问题:“如何访问 ListBox 中的各个行并更改每个行的属性?”
谢谢。
【问题讨论】:
【参考方案1】:您应该隐藏要绑定的集合中的元素,而不是控件本身。
利用 MVVM pattern 并将您的 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
在setter 上被触发等等。您还需要将项目模板的IsVisible
属性绑定到ElementVM
的IsVisible
属性。
【讨论】:
ListBox 已经绑定到一个 ObservableCollection。 (我正在修改旧代码,而不是开发新代码。)使用 Remove 方法从 ObservableCollection 中删除元素会导致应用程序出现问题,但我看不到任何方法可以简单地隐藏/折叠 ListBox 或在 ObservableCollection 中。除了使其中一个项目消失在屏幕上而不是在幕后之外,真的不需要特殊的定制。 @DaveInATL:我添加到我的答案中,它仍然是一个非常原始的解决方案,但你可以理解 Dyppl:我决定换个方向。我从项目源中删除了我不想显示的项目,然后在代码中的几个地方解决了这个问题。结果很好。但是,我确实要感谢您的时间和见解。戴夫以上是关于如何在不实际删除行的情况下明显折叠 Silverlight 4 ListBox 中的单行?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不折叠的情况下将 ListView 放入 ScrollView?