2014-03-19 47 views
1

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

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集合(数据表),并添加一行:

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

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

回答

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> 

在视图模型

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

当你添加新行到DataTable,一定要刷新名为myDataView。

+0

默认情况下,WPF将绑定到'DefaultView',所以我认为这与OP已经做的事情没有任何区别。 – Matt

+0

它已修复。我将itemsSource作为数据表,将行添加到数据表中(而不是数据视图),然后按照Mark的建议这样做: – KevinP

+0

确定在输入注释或提交注释时不要将Enter键作为CR命中:)它是固定的。谢谢Mark!我将itemsSource作为数据表,将行添加到数据表(而不是数据视图),然后Mark建议我创建一个数据视图并对其进行排序。 – KevinP

0

当底层集合中的属性更改时,ListView(和DataGrid)不会自动重新排序。既然你知道你结合的确切类型,为什么不创建该行并设置属性之前,你实际上它添加到集合:

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

很高兴知道,谢谢tencntraze。 – KevinP

相关问题