C# 在mvvm灯光下获取已排序的可观察集合
我已经将一个可观察的集合绑定到MVVM light VM中的基础设施xamDataGrid。在UI中,我有我的网格和一个按钮,当我点击按钮时,我想执行一个更新信息的操作。此操作需要相当长的时间,我希望按照GUI上显示的顺序更新数据。但是,可观察集合未排序,而是始终在未排序列表上更新。有没有办法在我的虚拟机中获取排序列表 虚拟机:C# 在mvvm灯光下获取已排序的可观察集合,c#,wpf,mvvm-light,observablecollection,xamdatagrid,C#,Wpf,Mvvm Light,Observablecollection,Xamdatagrid,我已经将一个可观察的集合绑定到MVVM light VM中的基础设施xamDataGrid。在UI中,我有我的网格和一个按钮,当我点击按钮时,我想执行一个更新信息的操作。此操作需要相当长的时间,我希望按照GUI上显示的顺序更新数据。但是,可观察集合未排序,而是始终在未排序列表上更新。有没有办法在我的虚拟机中获取排序列表 虚拟机: 公共类系统信息:ViewModelBase { 私有可观察收集活动站点; 专用中继命令_updatealCommand; /// ///初始化SystemInform
公共类系统信息:ViewModelBase
{
私有可观察收集活动站点;
专用中继命令_updatealCommand;
///
///初始化SystemInformation类的新实例。
///
公共系统信息():base()
{
ActiveSites=新的ObservableCollection();
}
公共可观察收集活动站点
{
得到
{
返回活动站点;
}
设置
{
设置(“活动站点”,参考活动站点,值);
}
}
public relay命令updatealCommand
{
得到
{
返回_updatealCommand
?(\u updatealCommand=新的继电器命令(
() =>
{
尝试
{
foreach(ActiveSites中的var站点)
{
//更新数据
}
}
捕获(例外情况除外)
{
//异常处理
}
});
}
));
}
}
}
}
视图:
全部加载
网格不会对实际的源集合进行排序,而是对其视图进行排序
如果希望能够按照项目在UI中的显示顺序获取项目,可以绑定到ICollectionView
属性:
public class SystemInformation : ViewModelBase
{
private ObservableCollection<Site> _activeSites;
private RelayCommand _updateAllCommand;
public SystemInformation() : base()
{
ActiveSites = new ObservableCollection<Site>();
View = CollectionViewSource.GetDefaultView(ActiveSites);
}
public System.ComponentModel.ICollectionView View { get; private set; } //<-- bind to this one
public ObservableCollection<Site> ActiveSites
{
get
{
return _activeSites;
}
set
{
Set("ActiveSites", ref _activeSites, value);
}
}
public RelayCommand UpdateAllCommand
{
get
{
return _updateAllCommand
?? (_updateAllCommand = new RelayCommand(() =>
{
foreach (var site in View.OfType<Site>())
{
//---
}
}));
}
}
}
公共类系统信息:ViewModelBase
{
私有可观察收集活动站点;
专用中继命令_updatealCommand;
公共系统信息():base()
{
ActiveSites=新的ObservableCollection();
View=CollectionViewSource.GetDefaultView(活动站点);
}
public System.ComponentModel.ICollectionView视图{get;private set;}//
{
foreach(视图中的var站点。of type())
{
//---
}
}));
}
}
}
试试看这里——这是另一种方式。他们希望在虚拟机中调整GUI。我希望vm中的集合根据GUI中发生的更改进行更新。除非我在这里完全遗漏了什么。我像这样实现了它,但它仍然没有给我排序的集合。也许这与基础设施有关?你的意思是当你枚举视图时,站点对象的顺序不正确。OfType?Jus发现了我的问题。这确实是基础设施方面的问题。默认情况下,xamdatagrid不使用collectionview!谢谢你的帮助!
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="5"/>
<RowDefinition Height="*"/>
<RowDefinition Height="5"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="5"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5"/>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="5"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="5"/>
</Grid.ColumnDefinitions>
<igDP:XamDataGrid x:Name="grdSysinfo" Grid.Row="1" Grid.Column="3" DataSource="{Binding ActiveSites, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged }" />
<Button Command="{Binding UpdateAllCommand}" CommandParameter="All" Grid.Row="3" Grid.Column="1">Load All</Button>
</Grid>
public class SystemInformation : ViewModelBase
{
private ObservableCollection<Site> _activeSites;
private RelayCommand _updateAllCommand;
public SystemInformation() : base()
{
ActiveSites = new ObservableCollection<Site>();
View = CollectionViewSource.GetDefaultView(ActiveSites);
}
public System.ComponentModel.ICollectionView View { get; private set; } //<-- bind to this one
public ObservableCollection<Site> ActiveSites
{
get
{
return _activeSites;
}
set
{
Set("ActiveSites", ref _activeSites, value);
}
}
public RelayCommand UpdateAllCommand
{
get
{
return _updateAllCommand
?? (_updateAllCommand = new RelayCommand(() =>
{
foreach (var site in View.OfType<Site>())
{
//---
}
}));
}
}
}
<igDP:XamDataGrid ... DataSource="{Binding View}" />