Silverlight ListBox с ObservableCollection <T>и динамическим фильтром - PullRequest
4 голосов
/ 17 сентября 2010

Допустим, у меня есть этот класс:

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

и

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

Добавление элементов в ObservableCollectionworks, как и ожидалось; тем не менее, я хочу убедиться, что мой список отображает только те элементы, для которых IsActive имеет значение «истина» - я не могу использовать запрос Linq для установки ItemsSource, потому что тогда он не является ObservableCollection, его IEnumerable и не делает любые уведомления об обновлениях в списке.

Ответы [ 2 ]

9 голосов
/ 17 сентября 2010

Ваш ответ - CollectionViewSource.Вместо привязки к списку привязывайте к экземпляру CollectionViewSource.

Далее следует слегка вырожденный пример (я не уверен, используете ли вы ViewModels, Locators и т. Д. Для разрешения ваших данных и вашего списка.)

Предположим, что в вашей разметке у вас есть CollectionViewSource, объявленный в ваших ресурсах следующим образом:

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

Тогда ваша привязка к списку будет выглядеть следующим образом:

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

Наконец, в коде выможет жениться на вашем списке и источнике представления вашей коллекции:

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

Кроме того, вы можете проверить статьи Беа Столльниц на эту тему по адресу:

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

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

0 голосов
/ 04 декабря 2012

Более простой способ - использовать Visibility в XAML.

Предполагается, что ListBox ItemTemplate использует StackPanel для хранения ваших данных, и в этом случае у вас есть 2 TextBlock внутри этого StackPanel (1 для данных1, 1 для данных2).

Так что вы должны связать это StackPanel Visibility с IsActive

...