0

在 C# 和 Silverlight 4 中工作,我使用绑定到数据源的 ListBox。此时三个项目在数据源中,因此出现在 ListBox 中。我需要第三项不出现在 ListBox 中,但由于各种原因仍然存在。

假设我的 ListBox 实例称为 myListBox。

基本上我想做的是这样的:

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

也许我应该问的一个更普遍的问题是:“如何访问 ListBox 中的各个行并更改每个行的属性?”

谢谢你。

4

1 回答 1

0

您应该隐藏要绑定的集合中的元素,而不是控件本身。

利用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在 setter 上触发它等等。您还需要将IsVisible项目模板的IsVisible属性绑定到ElementVM.

于 2011-06-07T22:51:19.503 回答