我已经和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";
非常感谢任何帮助,谢谢。
答案 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);