【问题标题】:Get sorted observable collection in mvvm light在 mvvm light 中获取排序的 observable 集合
【发布时间】:2017-07-13 19:23:03
【问题描述】:

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

虚拟机:

 public class SystemInformation : ViewModelBase
 {
    private ObservableCollection<Site> _activeSites;

    private RelayCommand _updateAllCommand;

    /// <summary>
    /// Initializes a new instance of the SystemInformation class.
    /// </summary>
    public SystemInformation() : base()
    {
        ActiveSites = new ObservableCollection<Site>();
    }


    public ObservableCollection<Site> ActiveSites
    {
        get
        {
            return _activeSites;
        }
        set
        {
            Set("ActiveSites", ref _activeSites, value);
        }
    }

    public RelayCommand UpdateAllCommand
    {
        get
        {
            return _updateAllCommand
              ?? (_updateAllCommand= new RelayCommand(
                () =>
                {
                        try
                        {
                            foreach (var site in ActiveSites)
                            {
                             // Update data
                            }
                        }
                        catch (Exception ex)
                        {
                           //Exception handling
                        }
                    });
                }
             ));
        }
    }
}

}

查看:

<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>

【问题讨论】:

  • 反之亦然。他们想在他们的虚拟机中调整他们的 GUI。我希望根据我的 GUI 中发生的更改来更新我的 vm 中的集合。除非我在这里完全遗漏了什么。

标签: c# wpf mvvm-light observablecollection xamdatagrid


【解决方案1】:

网格不对实际的源集合进行排序,而是对它的视图进行排序。

如果您希望能够按照它们在 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>())
                  {
                      //---
                  }
              }));
        }
    }
}

<igDP:XamDataGrid ... DataSource="{Binding View}" />

【讨论】:

  • 我是这样实现的,但它仍然没有给我排序的集合。也许这可能与基础设施有关?
  • 您的意思是枚举 View.OfType 时 Site 对象的顺序不正确吗?
  • 刚刚发现了我的问题。它确实是特定于基础设施的。 xamdatagrid 默认不使用collectionview! help.infragistics.com/Help/Doc/WPF/2012.2/CLR4.0/html/…感谢您的帮助!
猜你喜欢
  • 2012-04-27
  • 2016-12-08
  • 2011-12-23
  • 2016-12-10
  • 2014-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-01
相关资源
最近更新 更多