que c# wpf silverlight data-binding windows-phone-7

c# - que - Silverlight ListBox con ObservableCollection<T> y filtro dinámico



observablecollection methods (2)

Digamos que tengo esta clase:

public class MyData { public bool IsActive{get;set;} public String Data1 {get;set;} public String Data2 {get;set;} }

y un

ObservableCollection<MyData> data = new ObservableCollection<MyData>; ListBox.ItemsSource = data;

Agregar elementos a ObservableCollectionworks como se esperaba; sin embargo, quiero asegurarme de que mi listbox solo muestre los elementos donde IsActive está configurado como ''verdadero'' - No puedo usar una consulta de Linq para establecer el ItemsSource porque entonces no es un ObservableCollection, es IEnumerable y no hace ninguna actualización notificaciones al listbox.


Su respuesta es CollectionViewSource. En lugar de enlazar a la lista, enlazar a una instancia de CollectionViewSource.

A continuación se muestra un ejemplo ligeramente degenerado (no estoy seguro si está usando ViewModels, Locators, etc. para resolver sus datos y su lista).

Suponga que en su marcado tiene un CollectionViewSource declarado en sus recursos de la siguiente manera:

<phone:PhoneApplicationPage.Resources> <CollectionViewSource x:Key="src"/> </phone:PhoneApplicationPage.Resources>

Entonces su enlace de lista se ve así:

<ListBox x:Name="MyListBox" ItemsSource="{Binding Source={StaticResource src}}">

Finalmente, en el código puede casar su lista y su fuente de vista de colección:

var collectionView = this.Resources["src"] as CollectionViewSource; // Check for null, etc. collectionView.Source = observableCollectionThatIAmBindingTo; collectionView.View.Filter=new Predicate<Object>(o => ((ItemType)o).IsActive );

Además, es posible que desee consultar los artículos de Bea Stollnitz sobre el tema en:

http://bea.stollnitz.com/blog/?p=31

http://bea.stollnitz.com/blog/?p=392


La forma más fácil es usar Visibility en XAML.

ItemTemplate su ListBox ItemTemplate utiliza StackPanel para contener sus datos, y en este caso tiene 2 TextBlock dentro de este StackPanel (1 para Data1, 1 para Data2).

Entonces deberías unir la Visibility este StackPanel con IsActive