何时绑定对页面变为“活动”

时间:2011-07-26 13:38:12

标签: c# wpf data-binding

有一个页面并想要搜索绑定到某个属性的控件,我遍历VisualTree。这是在Page.Loaded事件(基于this question)上完成的。当遍历Visual Tree我遇到了我正在寻找的文本框(在测试用例中),但在使用时

var be = textbox.GetBindingExpression(System.Windows.Controls.TextBox.TextProperty);

be为空。

WPF是否仍然必须执行/渲染一些可视控件和绑定。如果是这样,我可以使用“激活”绑定来挂接哪个事件来遍历VisualTree?

顺便说一下:我已经让它在一个示例项目中工作,我点击按钮遍历VisualTree。 (页面已加载,绑定功能完全正常)

修改

XAML代码:

<dxe:TextEdit Grid.Row="2" Grid.RowSpan="1" Grid.Column="5" Style="{DynamicResource {x:Static cbc:CustomStyle.QuestionTextEditStyle}}" Text="{Binding Path=Voorletters, Mode=TwoWay, ValidatesOnDataErrors=true}"/>

代码背后:

private void BasePage_Loaded(object sender, RoutedEventArgs e)
{
 if (!String.IsNullOrEmpty(_focusControlBindedToProperty))
 {
  this.FindVisualElementBindedTo(this, _focusControlBindedToProperty);
 }
}

private void FindVisualElementBindedTo(Visual visual, String propertyName)
{
    try
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(visual); i++)
        {
            // Retrieve child visual at specified index value.
            Visual childVisual = (Visual)VisualTreeHelper.GetChild(visual, i);

            if (childVisual is System.Windows.Controls.Primitives.TextBoxBase)
            {
                System.Windows.Controls.Primitives.TextBoxBase tbb = (System.Windows.Controls.Primitives.TextBoxBase)childVisual;

                BindingExpression be = tbb.GetBindingExpression(System.Windows.Controls.TextBox.TextProperty);

                if (be != null && be.ParentBinding != null && be.ParentBinding.Path.Path == propertyName)
                {
                    tbb.Focus();
                    tbb.SelectAll();

                    return;
                }
            }

            FindVisualElementBindedTo(childVisual, propertyName);
        }
    }
    catch { }
}

1 个答案:

答案 0 :(得分:0)

好。排序。

在我创建的示例中,我使用了标准的Microsoft WPF控件(TextBox)。所以这一行:

if (childVisual is System.Windows.Controls.Primitives.TextBoxBase)

是对的。然而,在开发此功能的应用程序中,我们使用DevExpress WPF控件(TextEdit),它们具有“总”不同的继承层次结构。所以上面的if语句从未成功过。

绑定完全可以在page_load上运行,因为Microsft说:“Standard data binding (binding to local sources, such as other properties or directly defined data sources) will have occurred prior to Loaded