2014-03-19 46 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

相關問題