これには a を使用しValueConverter
ます。その方法を正確に説明することはできませんが、注目したいItemContainerGenerator
のは DataGrid のプロパティです。
DataGrid
ValueConverter にプロパティを追加して、Convert メソッドからアクセスできるようにします。ContainerFromItem
ここで、convert では、呼び出して UI オブジェクトを取得し、次にIndexFromContainer
行のインデックスを取得する必要があります。いくつかの問題が発生すると確信していますが、これで始められるはずです。
これの良いところは、独自のソートを行う必要がないことです。SortDescriptions
これは、DataGrid によって使用されるに追加されるICollectionView
(バインドしない場合は、自動的に作成される)に依存します。
編集
要求されたコード例は次のとおりです。自分でこれを行う必要はありませんでしたが、ここから始めます。
変換された提案された値は次のようになります
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 に手動で追加する必要はありません。列ヘッダーをクリックすると、並べ替えが自動的に適用されます。
**免責事項: このコードはテストされておらず、説明どおりに機能しない可能性があります。必要なロジックを示すのは、ここではプロバイダーです。そのため、タイプミスやバグが含まれている可能性があります。このコードを使用しようとする人は、独自のテストを実行して、ニーズに合っていることを確認する必要があります。