0

C# と Silverlight 4 を使用して、データ ソースにバインドされた ListBox を使用しています。この時点で 3 つの項目がデータ ソースにあるため、ListBox に表示されます。3 番目の項目が L​​istBox に表示されないようにする必要がありますが、それ以外の場合はさまざまな理由で存在する必要があります。

私の ListBox インスタンスが myListBox と呼ばれているとしましょう。

基本的に、私ができるようにしたいのは、次のようなものです。

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

おそらく、もっと一般的な質問として、「ListBox の個々の行にアクセスして、それぞれのプロパティを変更するにはどうすればよいですか?」という質問があります。

ありがとうございました。

4

1 に答える 1

0

コントロール自体ではなく、バインドしているコレクション内の要素を非表示にする必要があります。

MVVMパターンを利用して、リストボックスをビューモデルの監視可能なコレクションにバインドします。各アイテムが多くのカスタマイズをサポートする必要がある場合は、他のビューオデルの観察可能なコレクションである可能性があります。そうすれば、リストボックスの操作は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また、アイテムテンプレートのIsVisibleプロパティをのプロパティにバインドする必要がありますElementVM

于 2011-06-07T22:51:19.503 に答える