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:
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