ICollectionView не обновляется в пользовательском интерфейсе

Я использую ICollectionView для привязки источника wpfdatagrid.ICollectionView к наблюдаемой коллекции. я обновляю наблюдаемую коллекцию 5 секунд один раз. но коллекция модифицируется, но не обновляется до DataGrid.

public ICollectionView CollectionView { get; set; }

public ObservableCollection<AgentListEntryViewModel> AgentsViewModel
{
     get { return _agentsViewModel; }
     set { _agentsViewModel = value; }
}

я установил значение для представления коллекции ниже.

this.CollectionView = new ListCollectionView(this.AgentsViewModel);
this.CollectionView.Filter = this.SearchAgents;

в xaml я привязываю наблюдаемую коллекцию к сетке данных.

Я реализовал INotifyPropertyChanged в типе ObservableCollection, т.е. в AgentListEntryViewModel

private void LoadAgentComponents(List<AgentStateInfo> agentStateInfos = null)
    {
        foreach (AgentStateInfo agentStateInfo in agentStateInfos)
        {
            AgentListEntryViewModel agentEntry = this.AgentsViewModel.SingleOrDefault(agent => agent.AgentStateInfo.AgentId == agentStateInfo.AgentId);
            if (agentEntry != null)
            {
                agentEntry.UpdateAgentEntry(agentStateInfo);
            }
        }
        this.OnPropertyChanged("AgentsViewModel");
    }

вышеупомянутый метод, который я использую для обновления наблюдаемой коллекции.

 <DataGrid VerticalAlignment="Stretch" Grid.Row="2" Grid.ColumnSpan="3" Background="{StaticResource ControlLightColor}" BorderBrush="LightGray" BorderThickness="2" HorizontalAlignment="Stretch"
                              IsReadOnly="True"
                              GridLinesVisibility="Vertical"
                              VerticalGridLinesBrush="LightGray"
                              CanUserAddRows="False" 
                              CanUserResizeRows="False"
                              SelectionMode="Single"
                              AutoGenerateColumns="False" 
                              HeadersVisibility="Column"
                              SnapsToDevicePixels="True"
                              VerticalContentAlignment="Center" 
                              ItemsSource="{Binding AgentsViewModel}"
                              SelectedItem="{Binding SelectedAgentComponent}">
</DataGrid>

приведенный выше xaml я использовал для привязки к DataGrid.

но сетка данных не обновляется. Может кто-нибудь помочь мне .


person Ram Nivas    schedule 24.01.2014    source источник
comment
Вам нужно вызвать NotifyOfPropertyChanged в установщике.   -  person fhnaseer    schedule 24.01.2014
comment
Обновлять коллекцию путем добавления или меняется вся коллекция?   -  person Sankarann    schedule 24.01.2014


Ответы (3)


Рам Нивас,

Похоже, вы не применили INotifyPropertyChanged к своему свойству AgentsViewModel. Должно читаться что-то вроде

public ObservableCollection<AgentListEntryViewModel> AgentsViewModel
{
     get { return _agentsViewModel; }
     set 
     {
          if(_agentsViewModel != value){
            _agentsViewModel = value; 
            OnPropertyChanged("AgentsViewModel"); //or however you are calling your property changed
          }
     }
}

Хотя вы, возможно, реализовали интерфейс INotifyPropertyChanged в своей модели AgentListEntryViewModel, вы также должны применить ту же логику к интерфейсу AgentsViewModel.

Причина этого в том, что Binder будет прослушивать уведомления относительно свойства AgentsViewModel и не прослушивать изменения свойств каждого AgentListEntryViewModel.

person Nico    schedule 24.01.2014
comment
Можете ли вы опубликовать изменение кода в edit. А также образец привязки XAML? - person Nico; 24.01.2014

Вы not adding/deleting from collection (поэтому INotifyCollectionChanged не фигурирует).

Вместо этого вы изменяете какое-то свойство в базовом классе данных (AgentListEntryViewModel), что видно из этого фрагмента кода:

agentEntry.UpdateAgentEntry(agentStateInfo);

Если вы обновляете какое-то свойство, скажем, AgentStateInfo, то это свойство должно вызывать событие PropertyChangedEvent, т. е. AgentListEntryViewModel должно реализовывать INPC.

Но если вы хотите обновить полное представление, вы можете вызвать Refresh() для экземпляра ICollectionView (хотя это не очень хорошая идея), как только вы закончите изменение свойства:

CollectionView.Refresh();
person Rohit Vats    schedule 24.01.2014

Используйте событие INotifyPropertyChanged и наследуйте от него свой класс Datacontext.

затем используйте следующий код в этом классе

public event PropertyChangedEventHandler PropertyChanged;



protected void RaisePropertyChanged<T>(Expression<Func<T>> action)
{
    var propertyName = GetPropertyName(action);
    RaisePropertyChanged(propertyName);
}
private static string GetPropertyName<T>(Expression<Func<T>> action)
{
     var expression = (MemberExpression)action.Body;
     var propertyName = expression.Member.Name;
     return propertyName;
}

и позвольте установить ваше свойство в наблюдаемой коллекции. Так что это обновлено означает, что оно будет изменено в пользовательском интерфейсе.

        public string UserName
        {
            get
            {
                return _userName;
            }
            set
            {
                if (_userName != value)
                {
                    _userName = value;
                    RaisePropertyChanged(() => UserName);
                }
            }
        }

и на странице xaml объявите свой элемент управления следующим образом

<TextBlock HorizontalAlignment="Left" FontWeight="Normal" Margin="2" MinWidth="100" 

Grid.Row="6" Grid.Column="2" FontFamily="Calibri" Name="txtKey14" VerticalAlignment="Center" Text="{Binding UserName}"/>

Что ж, теперь вы получили представление о том, как динамически обновлять данные. Надеюсь, поможет....!

person Manikandan Sekar    schedule 24.01.2014