WPF DataGrid:如何获取单元格的绑定表达式?
我需要访问DataGridTextColumn中DataGrid单元格的绑定表达式。例如:WPF DataGrid:如何获取单元格的绑定表达式?,wpf,binding,datagrid,Wpf,Binding,Datagrid,我需要访问DataGridTextColumn中DataGrid单元格的绑定表达式。例如: <DataGridTextColumn Header="Name" Binding="{Binding Name}"/> 更新单元格文本。它似乎正在网格上工作(编号已更新)。然而,正如我在一段时间后意识到的,源代码没有得到更新。即使我将UpdateSourceTracger设置为PropertyChange,也没有任何帮助。然后,我想我需要得到绑定表达式并显式调用Update
<DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
更新单元格文本。它似乎正在网格上工作(编号已更新)。然而,正如我在一段时间后意识到的,源代码没有得到更新。即使我将UpdateSourceTracger设置为PropertyChange,也没有任何帮助。然后,我想我需要得到绑定表达式并显式调用UpdateSource
var bindingExpr = cell.GetBindingExpression(TextBlock.TextProperty);
但是bindingExpr总是空的。为什么?
编辑:
我遇到的最初问题是,我可以访问单元格的绑定TextBlock,并设置TextBlock.TextProperty。但是,源代码没有得到更新。这是我试图解决的问题。DataGridTextColumn中的
文本框
将不具有绑定表达式。列本身具有绑定
DataGridTextColumn
是从DataGridBoundColumn
派生的,它使用的是BindingBase
属性而不是TextBlock.TextProperty
,但是Binding
属性不是DependencyProperty
,因此您必须使用普通的公共属性进行访问
因此,您必须进行一些转换,因为DataGridTextColumn
中的Binding
属性的类型是BindingBase
像这样的东西应该可以用(未经测试)
TextBox t=e.EditingElement作为TextBox;
字符串b=t.GetBindingExpression(TextBox.TextProperty).ResolvedSourcePropertyName 您需要找到
文本块
:
var textBlock = cell.FindVisualChild<TextBlock>();
BindingExpression bindingExpression = textBlock.GetBindingExpression(
TextBlock.TextProperty);
谢谢你的快速回复。您的代码确实让我找到了该列的绑定。然而,这并不能解决我的问题。如何获取单元格的bindingExpression?关键是调用BindingExpression.UpdateSource(),因为如果我设置TextBlock.Text,源代码就不会更新。1用于将列强制转换为DataGridBundColumn和oops!对我说:)您好,问题解决了吗?默认情况下,列的SortMemberPath将包含绑定路径(这是启用按绑定属性排序的默认属性值)。获取绑定路径的方法不可靠,也不适用于多个绑定或手动设置SortMemberPath时。
var bindingExpr = cell.GetBindingExpression(TextBlock.TextProperty);
var binding = (yourGrid.Columns[0] as DataGridBoundColumn).Binding as Binding;
var textBlock = cell.FindVisualChild<TextBlock>();
BindingExpression bindingExpression = textBlock.GetBindingExpression(
TextBlock.TextProperty);
public static class DependencyObjectExtensions
{
[NotNull]
public static IEnumerable<T> FindVisualChildren<T>([NotNull] this DependencyObject dependencyObject)
where T : DependencyObject
{
if (dependencyObject == null) throw new ArgumentNullException(nameof(dependencyObject));
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(dependencyObject); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(dependencyObject, i);
if (child is T o)
yield return o;
foreach (T childOfChild in FindVisualChildren<T>(child))
yield return childOfChild;
}
}
public static childItem FindVisualChild<childItem>([NotNull] this DependencyObject dependencyObject)
where childItem : DependencyObject
{
if (dependencyObject == null) throw new ArgumentNullException(nameof(dependencyObject));
foreach (childItem child in FindVisualChildren<childItem>(dependencyObject))
return child;
return null;
}
}