添加行后以编程方式重新排序ListView ItemsSource

时间:2014-03-19 15:19:29

标签: c# wpf listview sorting datatable

我已经和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;    

我试过的方法:

方法#1 :(位置是数据表列名,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";  

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

2 个答案:

答案 0 :(得分:0)

您绑定到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>

在ViewModel中

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

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

答案 1 :(得分:0)

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

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