gpt4 book ai didi

c# - 如何拖放 DataGrid 列标题?

转载 作者:太空狗 更新时间:2023-10-29 23:18:36 27 4
gpt4 key购买 nike

我正在使用 WPF DataGrid。我必须拖动列标题,将其放到其他控件(比如标签)上并执行一些操作。但我无法实现 DataGrid 列标题的拖放。我尝试使用 ColumnHeaderDragStarted 事件,但我无法在处理程序中找到列标题对象或标题名称。请帮忙!!

最佳答案

也许这可以帮到你:

在 XAML 上:

关于 C# 代码:

    private void DataGrid_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
DependencyObject dep = (DependencyObject)e.OriginalSource;

while ((dep != null) && !(dep is DataGridCell) && !(dep is DataGridColumnHeader))
{
dep = VisualTreeHelper.GetParent(dep);
}

if (dep == null)
return;

if (dep is DataGridColumnHeader)
{
DataGridColumnHeader columnHeader = dep as DataGridColumnHeader;

// find the property that this cell's column is bound to
string boundPropertyName = FindBoundProperty(columnHeader.Column);

int columnIndex = columnHeader.Column.DisplayIndex;

ClickedItemDisplay.Text = string.Format(
"Header clicked [{0}] = {1}",
columnIndex, boundPropertyName);
}

if (dep is DataGridCell)
{
DataGridCell cell = dep as DataGridCell;

// navigate further up the tree
while ((dep != null) && !(dep is DataGridRow))
{
dep = VisualTreeHelper.GetParent(dep);
}

if (dep == null)
return;

DataGridRow row = dep as DataGridRow;

object value = ExtractBoundValue(row, cell);

int columnIndex = cell.Column.DisplayIndex;
int rowIndex = FindRowIndex(row);

ClickedItemDisplay.Text = string.Format(
"Cell clicked [{0}, {1}] = {2}",
rowIndex, columnIndex, value.ToString());
}
}

/// <summary>
/// Determine the index of a DataGridRow
/// </summary>
/// <param name="row"></param>
/// <returns></returns>
private int FindRowIndex(DataGridRow row)
{
DataGrid dataGrid = ItemsControl.ItemsControlFromItemContainer(row) as DataGrid;

int index = dataGrid.ItemContainerGenerator.IndexFromContainer(row);

return index;
}

/// <summary>
/// Find the value that is bound to a DataGridCell
/// </summary>
/// <param name="row"></param>
/// <param name="cell"></param>
/// <returns></returns>
private object ExtractBoundValue(DataGridRow row, DataGridCell cell)
{
// find the property that this cell's column is bound to
string boundPropertyName = FindBoundProperty(cell.Column);

// find the object that is realted to this row
object data = row.Item;

// extract the property value
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(data);
PropertyDescriptor property = properties[boundPropertyName];
object value = property.GetValue(data);

return value;
}

/// <summary>
/// Find the name of the property which is bound to the given column
/// </summary>
/// <param name="col"></param>
/// <returns></returns>
private string FindBoundProperty(DataGridColumn col)
{
DataGridBoundColumn boundColumn = col as DataGridBoundColumn;

// find the property that this column is bound to
Binding binding = boundColumn.Binding as Binding;
string boundPropertyName = binding.Path.Path;

return boundPropertyName;
}
}

// This XAML and C# where extracted from a link contained on this URL:
// http://social.msdn.microsoft.com/Forums/en/wpf/thread/61707b8a-e6c6-474b-ac2b-3446319625bd

关于c# - 如何拖放 DataGrid 列标题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4605476/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com