我会为此使用 a ValueConverter
。我不能确切地告诉你怎么做,但是,你要查看的是ItemContainerGenerator
DataGrid 上的属性。
向您的 ValueConverter添加一个DataGrid
属性,以便您可以从 Convert 方法访问该属性。现在,在转换中,您需要调用ContainerFromItem
以获取 UI 对象,然后IndexFromContainer
获取行的索引。我相信你会遇到一些问题,但这应该让你开始。
这样做的好处是您不必自己进行排序。这将依赖于SortDescriptions
添加到ICollectionView
DataGrid 使用的(如果您不绑定到一个,它会自动为您创建)。
编辑
这是请求的代码示例。我自己不需要这样做,但这是我要开始的地方。
以下是转换后的建议值的外观
public ItemPositionValueConverter : IValueConverter
{
public DataGrid DataGrid { get; set; }
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
{
return null;
}
if (DataGrid == null)
{
return null;
}
ItemContainerGenerator generator = DataGrid.ItemContainerGenerator;
return generator.IndexFromContainer(generator.ContainerFromItem(value));
}
//you probably don't need ConvertBack put it is provided for completeness
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
int? index = value as int?
if (index == null)
{
return null
}
if (DataGrid == null)
{
return null;
}
ItemContainerGenerator generator = DataGrid.ItemContainerGenerator;
return generator.ItemFromContainer(generator.ContainerFromIndex(index.Value));
}
}
现在使用这个做类似的事情。
<UserControl>
<UserControl.Resources>
<ItemPositionValueConverter x:Key=ItemPositionValueConverter"
DataGrid="{Binding ElementName=MyDataGrid}" />
</UserControl.Resources>
<DataGrid x:Name="MyDataGrid" ItemsSource="{Binding ....}">
<DataGrid.Columns>
<DataGridTextColumn Header="Position"
Binding="{Binding Converter={StaticResource ItemPositionValueConverter}}"/>
</DataGrid.Columns>
</UserControl>
请注意,使用此解决方案,无需手动将排序添加到 ICollectionView。单击列标题时,将自动应用排序。
**免责声明:此代码已经过测试,可能与描述的功能不完全相同。这里是提供者来演示所需的逻辑。因此,它可能包含拼写错误或错误。任何尝试使用此代码的人都应该执行自己的测试以验证它是否适合他们的需求。