Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在mvvm灯光下获取已排序的可观察集合_C#_Wpf_Mvvm Light_Observablecollection_Xamdatagrid - Fatal编程技术网

C# 在mvvm灯光下获取已排序的可观察集合

C# 在mvvm灯光下获取已排序的可观察集合,c#,wpf,mvvm-light,observablecollection,xamdatagrid,C#,Wpf,Mvvm Light,Observablecollection,Xamdatagrid,我已经将一个可观察的集合绑定到MVVM light VM中的基础设施xamDataGrid。在UI中,我有我的网格和一个按钮,当我点击按钮时,我想执行一个更新信息的操作。此操作需要相当长的时间,我希望按照GUI上显示的顺序更新数据。但是,可观察集合未排序,而是始终在未排序列表上更新。有没有办法在我的虚拟机中获取排序列表 虚拟机: 公共类系统信息:ViewModelBase { 私有可观察收集活动站点; 专用中继命令_updatealCommand; /// ///初始化SystemInform

我已经将一个可观察的集合绑定到MVVM light VM中的基础设施xamDataGrid。在UI中,我有我的网格和一个按钮,当我点击按钮时,我想执行一个更新信息的操作。此操作需要相当长的时间,我希望按照GUI上显示的顺序更新数据。但是,可观察集合未排序,而是始终在未排序列表上更新。有没有办法在我的虚拟机中获取排序列表

虚拟机:

公共类系统信息: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}" />