5

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

        <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>

我设法获得了与单元格关联的 TextBlock:

        var cell = dataGrid.GetCellCtrl<TextBlock>(dataGrid.CurrentCell);

细胞似乎是正确的。我可以打电话

        cell.SetValue(TextBlock.TextProperty, value);

更新单元格文本。它似乎在网格上工作(数字已更新)。但是,正如我在一段时间后意识到的那样,源代码并没有得到更新。即使我将 UpdateSourceTrigger 转换为 PropertyChange,它也无济于事。然后,我想我需要获取绑定表达式并显式调用 UpdateSource。

        var bindingExpr = cell.GetBindingExpression(TextBlock.TextProperty);

但 bindingExpr 始终为空。为什么?

编辑:我最初遇到的问题是我可以获取单元格的绑定 TextBlock,并设置 TextBlock.TextProperty。但是,源没有得到更新。这是我试图解决这个问题的事情。

4

3 回答 3

7

TextBox中的将DataGridTextColumn不具有绑定表达式,列本身具有绑定。

DataGridTextColumn派生自DataGridBoundColumnwhich uses a BindingBaseproperty not TextBlock.TextProperty,但是该Binding属性不是 a DependancyProperty,因此您必须使用普通的公共属性进行访问。

因此,您必须进行一些转换,因为 in 中的Binding属性DataGridTextColumn是 type BindingBase

像这样的东西应该可以工作(未经测试)

var binding = (yourGrid.Columns[0] as DataGridBoundColumn).Binding as Binding;
于 2013-03-05T07:01:11.333 回答
0

您需要找到TextBlock

var textBlock = cell.FindVisualChild<TextBlock>();
BindingExpression bindingExpression = textBlock.GetBindingExpression(
  TextBlock.TextProperty);

代码FindVisualChild()

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;
    }
}
于 2020-12-11T10:52:15.503 回答
-2

TextBox t = e.EditingElement as TextBox; 字符串 b= t.GetBindingExpression(TextBox.TextProperty).ResolvedSourcePropertyName;

于 2017-04-06T06:31:30.353 回答