要获取 DataGridCell 的数据,您可以使用它的 DataContext 和Column
财产。如何做到这一点完全取决于您的行数据是什么,即您在行数据中放入了哪些项目ItemsSource
DataGrid 的集合。假设您的物品是object[]
arrays:
// 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
属性和行数据项更改为行数据项上的特定值。
EDIT:
如果您将数据放入的单元格不是选定的单元格,一种选择是获取DataGridRow
到其中DataGridCell
属于,使用VisualTreeHelper
:
var parent = VisualTreeHelper.GetParent(gridCell);
while(parent != null && parent.GetType() != typeof(DataGridRow))
{
parent = VisualTreeHelper.GetParent(parent);
}
var dataRow = parent;
然后您就拥有了该行,并且可以按照上面的方式继续操作。
此外,关于您是否应该重新考虑该方法的问题,我建议使用自定义WPF 行为 s.
行为提供了一种非常直接的方法来从 C# 代码(而不是 XAML)扩展控件的功能,同时保持代码隐藏清晰和简单(如果您遵循 MVVM,这不仅是件好事)。行为的设计方式是可重用且不受您的特定控制的约束。
这里有一个很好的介绍 http://wpftutorial.net/Behaviors.html
对于你的特殊情况,我只能告诉你该怎么做:
写一个DropBehavior
对于您的 TextBlock 控件(或您想要在 DataGrid 单元格中处理拖放的任何控件)。基本思想是根据单元格中单元格的事件来注册操作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
财产变得过时。
然后将此行为附加到 TextBlocks,将其放入单元格中,使用ContentTemplate
of the 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>
基类在
系统.Windows.Interactivity.dll
我还没有测试过,但我希望它对你有用并且你明白了......