ItemsControl не обрабатывает и не перефильтровывает после первой загрузки страницы - PullRequest
0 голосов
/ 17 февраля 2012

Я создаю приложение с картой погоды, которая показывает жару в виде кнопки в разных местах.Для этого предоставляется собственный PushpinModel, который поддерживает интерфейс INotifyPropertyChanged:

public class PushpinModel: INotifyPropertyChanged
    {
        #region // events
        public event PropertyChangedEventHandler PropertyChanged;
        #endregion events

        #region // fields
        Heat heat = Heat.normal;
        #endregion fields

        #region // properties
        public string Placename { get; set; }
        public GeoCoordinate Location { get; set; }
        public Heat Heat 
        {
            get { return heat; }
            set
            {
                if (heat != value)
                {
                    heat = value;
                    OnPropertyChanged("Heat"); 
                }
            }
        }
        public string IDno { get; set; }
        #endregion  properties

        #region // handlers
        protected virtual void OnPropertyChanged(string propChanged)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propChanged));
        }
        #endregion  handlers
    }

Объекты PushpinModel содержатся в ObservableCollection, называемых Pushpins, которые периодически обновляются до ShowWeather:

public class Pushpins: ObservableCollection<PushpinModel>
    {

        #region // METHODS
        public void ShowWeather( WeatherReport fromWeatherReport)
        {
            foreach (WeatherRecord w in fromWeatherReport.WeatherRecords)
            {
                    this.First<PushpinModel>(p => p.IDno == w.PlaceID).Heat = w.Heat;
            }
        }
        #endregion methods
    }

Я отображаю Pushpins на карте Bing, но также как элементы в ItemsControl:

 <ItemsControl x:Name="ItemList" ItemsSource="{Binding Source={StaticResource placesSortedAndFiltered}}">
                        <ItemsControl.ItemTemplate>
                            <DataTemplate>
                                <Border>
                                    <TextBlock Text="{Binding Placename}" />
                                </Border>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>

ItemsSource определяется как CollectionViewSource:

<CollectionViewSource  x:Key="placesSortedAndFiltered" Source="{Binding ElementName=MyMainPage, Path=Pushpins}" Filter="PlaceHeat_Filter">
    <CollectionViewSource.SortDescriptions>
        <componentmodel:SortDescription PropertyName="Placename" Direction="Ascending" />
    </CollectionViewSource.SortDescriptions>
</CollectionViewSource>

с фильтром в заднем коде, определенном как:

 private void PlaceHeat_Filter(object sender, FilterEventArgs e)
        {
            e.Accepted = (((PushpinModel)e.Item).Heat != Heat.na);

        }

, где общедоступное перечисление Heat {нет, круто, нормально, тепло, горячо}фильтруется при загрузке страницы, но НЕ обновляется при изменении свойств объектов PushpinModel.Обратите внимание, что когда объект Pushpins привязан к элементу управления Bing Map, объекты PushpinModel обновляются должным образом.Так или иначе, мой список ItemsControl не обновляется, даже если он связан через CollectionView с ObservableCollection

1 Ответ

1 голос
/ 17 февраля 2012

Я считаю, что реализация CollectionViewSource поддерживает автоматическую фильтрацию только при изменении (или сбросе) базовой коллекции. Фильтр не вызывается при изменении свойства базового элемента данных.

Вы можете либо вызвать Refresh() на CollectionViewSource, когда свойство элемента в коллекции изменяется, либо вы можете реализовать свой собственный CollectionViewSource, который прослушивает события изменения свойства в базовых объектах данных, или вы можете связать непосредственно в фильтрованную (и отсортированную) коллекцию вместо использования CollectionViewSource.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...