ICollectionView不在UI中更新

时间:2014-01-24 06:58:35

标签: c# wpf observablecollection collectionview

我正在使用ICollectionView绑定wpfdatagridICollectionView source是可观察的集合。我一次更新可观察的集合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中,我将可观察集合绑定到数据网格。

我在ObservableCollection类型中实现了INotifyPropertyChanged,即在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。

但数据网格未更新。谁能帮我 。

3 个答案:

答案 0 :(得分:1)

Ram Nivas,

您似乎没有将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属性的更改。

答案 1 :(得分:1)

你是not adding/deleting from collection(所以INotifyCollectionChanged没有进入画面)。

相反,您正在修改基础数据类(AgentListEntryViewModel)中的某些属性,这可以从这段代码中看出:

agentEntry.UpdateAgentEntry(agentStateInfo);

如果您要更新某些属性AgentStateInfo,那么属性应该引发PropertyChangedEvent ,即AgentListEntryViewModel应该实现INPC。

但是如果你想刷新完整的视图,你可以在完成修改属性后在ICollectionView实例上调用Refresh()(虽然不是很好):

CollectionView.Refresh();

答案 2 :(得分:0)

使用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;
}

并将您的属性设置在一个可观察的集合中。因此,它已更新意味着它将在UI中更改。

        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}"/>

现在您已经了解了如何动态更新数据。 希望它有帮助......!