Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF DataGrid:如何获取单元格的绑定表达式?_Wpf_Binding_Datagrid - Fatal编程技术网

WPF DataGrid:如何获取单元格的绑定表达式?

WPF DataGrid:如何获取单元格的绑定表达式?,wpf,binding,datagrid,Wpf,Binding,Datagrid,我需要访问DataGridTextColumn中DataGrid单元格的绑定表达式。例如: <DataGridTextColumn Header="Name" Binding="{Binding Name}"/> 更新单元格文本。它似乎正在网格上工作(编号已更新)。然而,正如我在一段时间后意识到的,源代码没有得到更新。即使我将UpdateSourceTracger设置为PropertyChange,也没有任何帮助。然后,我想我需要得到绑定表达式并显式调用Update

我需要访问DataGridTextColumn中DataGrid单元格的绑定表达式。例如:

        <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;
    }
}