要获取DataGridCell的数据,您可以使用它的DataContext和Column属性。如何实现取决于行数据是什么,即您将哪些项目放入DataGrid的ItemsSource集合中。假设您的项目是数组:
var rowData = (object[]) DataGrid.SelectedCells[0].Item;
var celldata = rowData[DataGrid.SelectedCells[0].Column.DisplayIndex];
如果您的行数据更复杂,您需要编写相应的方法来将“列”属性和行数据项翻译为其在行数据项上的特定值。
编辑:
如果您将数据拖放到的单元格不是选定单元格,则一种选择是使用VisualTreeHelper
获取所属于DataGridCell
的DataGridRow
:
var parent = VisualTreeHelper.GetParent(gridCell);
while(parent != null && parent.GetType() != typeof(DataGridRow))
{
parent = VisualTreeHelper.GetParent(parent);
}
var dataRow = parent;
接下来您就可以按照上述步骤进行操作。
此外,关于您是否应该重新考虑这种方法的问题,我建议使用自定义WPF行为。
行为提供了一种非常直观的方式来从C#代码扩展控件的功能,而不是XAML,并保持您的代码干净简单(如果您遵循MVVM,则不仅仅是好的)。 行为被设计为可重用且不绑定于特定的控件。
这里是一个很好的介绍
对于您的特殊情况,我只能给您一个想法:
编写一个 DropBehavior
,用于处理TextBlock控件(或您要在DataGridCells中放置的任何其他控件)的拖放。 基本思路是在您的控件的 OnAttached()
方法中,为单元格的事件注册相应的操作。
public class DropBehavior : Behavior<TextBlock>
{
protected override void OnAttached()
{
AssociatedObject.MouseUp += AssociatedObject_MouseUp;
}
private void AssociatedObject_MouseUp(object sender, MouseButtonEventArgs e)
{
var cellData = AssociatedObject.DataContext;
}
}
请注意,从行数据中解析单元格数据和
Column
属性已经过时。
然后,您可以使用DataGrid的
CellStyle
的
ContentTemplate
将此行为附加到TextBlocks中,然后将TextBlocks放置在单元格内。
<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>
您可以在
System.Windows.Interactivity.dll
中找到Behavior<T>
基类。
虽然我没有测试过,但我希望它能为您工作,并且您能理解这个概念...