有一个页面并想要搜索绑定到某个属性的控件,我遍历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 { }
}
答案 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”