如何在不实际删除行的情况下明显折叠 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 属性绑定到ElementVMIsVisible 属性。

【讨论】:

ListBox 已经绑定到一个 ObservableCollection。 (我正在修改旧代码,而不是开发新代码。)使用 Remove 方法从 ObservableCollection 中删除元素会导致应用程序出现问题,但我看不到任何方法可以简单地隐藏/折叠 ListBox 或在 ObservableCollection 中。除了使其中一个项目消失在屏幕上而不是在幕后之外,真的不需要特殊的定制。 @DaveInATL:我添加到我的答案中,它仍然是一个非常原始的解决方案,但你可以理解 Dyppl:我决定换个方向。我从项目源中删除了我不想显示的项目,然后在代码中的几个地方解决了这个问题。结果很好。但是,我确实要感谢您的时间和见解。戴夫

以上是关于如何在不实际删除行的情况下明显折叠 Silverlight 4 ListBox 中的单行?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不选择下拉菜单的情况下折叠/关闭组合框?

Vis.js 时间轴 - 如何在不嵌套的情况下折叠组

如何在不折叠的情况下将 ListView 放入 ScrollView?

vim - 如何在不计算行数的情况下删除一大块文本?

如何在不折叠空格的情况下在 bash 脚本中拆分制表符分隔的字符串?

如何在不删除项目本身的情况下删除单个 HABTM 关联项目?