我正在使用ICollectionView
绑定wpfdatagrid
。ICollectionView
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。
但数据网格未更新。谁能帮我 。
答案 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}"/>
现在您已经了解了如何动态更新数据。 希望它有帮助......!