Column
DataGridCell のデータを取得するには、その DataContext とプロパティを使用できます。それを行う方法は、行データが何であるか、つまりItemsSource
、DataGrid のコレクションに入れる項目によって異なります。object[]
アイテムが配列であると仮定します。
// Assuming this is an array of objects, object[],this gets you the
// row data as you have them in the DataGrid's ItemsSource collection
var rowData = (object[]) DataGrid.SelectedCells[0].Item;
// This gets you the single cell object
var celldata = rowData[DataGrid.SelectedCells[0].Column.DisplayIndex];
行データがより複雑な場合は、Column
プロパティと行データ項目を行データ項目の特定の値に変換する適切なメソッドを記述する必要があります。
編集:
データをドロップしたセルが選択されたセルではない場合、1 つのオプションは、以下を使用してデータが属するセルを取得するDataGridRow
ことDataGridCell
ですVisualTreeHelper
。
var parent = VisualTreeHelper.GetParent(gridCell);
while(parent != null && parent.GetType() != typeof(DataGridRow))
{
parent = VisualTreeHelper.GetParent(parent);
}
var dataRow = parent;
次に、行を取得し、上記のように続行できます。
さらに、メソッドを再考する必要があるかどうかの質問に関しては、カスタムWPF ビヘイビアを使用することをお勧めします。
ビヘイビアーは、XAML ではなく C# コードからコントロールの機能を拡張するための非常に簡単な方法を提供しますが、分離コードを明確かつシンプルに保ちます (これは、MVVM に従っている場合に便利なだけではありません)。動作は、再利用可能で、特定のコントロールにバインドされないように設計されています。
ここに良い紹介があります
あなたの特別なケースのために、私はあなたに何をすべきかについての考えだけを与えることができます:
TextBlock コントロール (または、ドロップを処理する DataGridCells 内に必要な任意のコントロール) 用に1 つ記述します。基本的な考え方は、コントロールのメソッドDropBehavior
内のセルのイベントに応じてアクションを登録することです。OnAttached()
public class DropBehavior : Behavior<TextBlock>
{
protected override void OnAttached()
{
AssociatedObject.MouseUp += AssociatedObject_MouseUp;
}
private void AssociatedObject_MouseUp(object sender, MouseButtonEventArgs e)
{
// Handle what happens on mouse up
// Check requirements, has data been dragged, etc.
// Get underlying data, now simply as the DataContext of the AssociatedObject
var cellData = AssociatedObject.DataContext;
}
}
行データとColumn
プロパティから単一セルのデータを解析することは廃止されることに注意してください。
次に、DataGridContentTemplate
のを使用して、この動作をセル内に配置する TextBlocks にアタッチします。CellStyle
<DataGrid>
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock Text="{Binding}">
<i:Interaction.Behaviors>
<yourns:DropBehavior/>
</i:Interaction.Behaviors>
</TextBlock>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</DataGrid.CellStyle>
</DataGrid>
Behavior<T>
ベースクラスは次の場所にあります
System.Windows.Interactivity.dll
私はそれをテストしていませんが、うまくいくことを願っています...