【问题标题】:Re-Sorting ListView ItemsSource Programmatically After Adding Row添加行后以编程方式重新排序 ListView ItemsSource
【发布时间】:2014-04-25 23:10:02
【问题描述】:

我使用 WPF (C#) 已经六个月了。我已经尝试了所有可以在网上找到的方法,但都没有运气。当我向 listView ItemsSource (DataTable) 添加新行时,它会作为最后一行添加到末尾。问题是我需要它作为第一行位于顶部,所以在添加它之后我想以编程方式重新排序它,以便新行位于顶部。我尝试过的方法没有任何错误,只是不起作用。

XAML:
<ListView
    ItemsSource="{Binding MyDataTable, Mode=TwoWay, 
        NotifyOnTargetUpdated=True, NotifyOnSourceUpdated=True, 
        UpdateSourceTrigger=PropertyChanged}"                               
    x:Name=MyListView" Height="291">                               
    <ListView.View>
        <GridView x:Name="GridView1">
             <GridViewColumn x:Name="ColumnToSort" 
                     DisplayMemberBinding="{Binding Path=position}">
                 <!--<GridViewColumn.Header>
                      <GridViewColumnHeader Tag="position"/>
                      </GridViewColumn.Header>-->
             </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

我得到itemsource集合(DataTable)并添加一行:

DataView collection = (DataView)MyListView.ItemsSource;
DataRowView drv = collection.AddNew();
drv["position"] = 1;    

我尝试过的方法:

方法一:(position为数据表列名,MyDataTable为VM DP)

DataView view = MyViewModel.MyDataTable.DefaultView;
view.Sort = "position ASC";

方法#2(尝试按标题标签道具和列名排序)

string sortby = header.Tag.ToString();
Sort(SortBy, ListSortDirection.Ascending);

private void Sort(string sortBy, ListSortDirection direction)
    {
        ICollectionView dataView =  
             CollectionViewSource.GetDefaultView(MyListView.ItemsSource);

        dataView.SortDescriptions.Clear();
        SortDescription sd = new SortDescription(sortBy, direction);
        dataView.SortDescriptions.Add(sd);
        dataView.Refresh();            
    }

方法#3:

DataView view = new DataView(MyViewModel.MyDataTable);
view.Sort = "position ASC";

方法#4:

MyViewModel.MyDataTable.DefaultView.Sort = "position ASC";  

非常感谢任何帮助,谢谢。

【问题讨论】:

    标签: c# wpf listview sorting datatable


    【解决方案1】:

    当基础集合中的属性更改时,ListView(和 DataGrid)不会自动重新排序。既然您知道要绑定的确切类型,为什么不在实际将其添加到集合之前创建行并设置属性:

    var newRow = this.MyDataTable.NewRow();
    newRow["Position"] = 1;
    this.MyDataTable.Rows.Add(newRow);
    

    【讨论】:

      【解决方案2】:

      您绑定的是 DataTable,而不是 DataView。

      XAML:

      <ListView
          ItemsSource="{Binding MyDataView, Mode=TwoWay, 
              NotifyOnTargetUpdated=True, NotifyOnSourceUpdated=True, 
              UpdateSourceTrigger=PropertyChanged}"                               
          x:Name=MyListView" Height="291">                               
          <ListView.View>
              <GridView x:Name="GridView1">
                   <GridViewColumn x:Name="ColumnToSort" 
                           DisplayMemberBinding="{Binding Path=position}">
                       <!--<GridViewColumn.Header>
                            <GridViewColumnHeader Tag="position"/>
                            </GridViewColumn.Header>-->
                   </GridViewColumn>
              </GridView>
          </ListView.View>
      </ListView>
      

      在视图模型中

      this.MyDataView = MyDataTable.DefaultView;
      MyDataView.Sort = "position ASC";
      

      将新行添加到 DataTable 时,请务必刷新 MyDataView。

      【讨论】:

      • 默认情况下,WPF 将绑定到 DefaultView,所以我认为这与 OP 已经在做的事情没有什么不同。
      • 已修复。我将 itemsSource 作为数据表,将行添加到数据表(而不是数据视图),然后按照 Mark 的建议进行操作:
      • 好的,当您输入评论或提交评论时,不要按回车键作为 CR :) 它已修复。谢谢马克!我将 itemsSource 保留为数据表,向数据表添加行(而不是数据视图),然后按照 Mark 的建议,我创建了一个数据视图并对其进行了排序。
      猜你喜欢
      • 2019-12-12
      • 1970-01-01
      • 2012-08-30
      • 1970-01-01
      • 2011-10-05
      • 2012-12-03
      • 1970-01-01
      • 2010-10-14
      • 2012-10-27
      相关资源
      最近更新 更多