Когда привязки становятся «активными» для страницы - PullRequest
0 голосов
/ 26 июля 2011

Имея страницу и желая найти элемент управления, связанный с определенным свойством, я пересекаю VisualTree.Это делается для события Page.Loaded (на основе этого вопроса ).При обходе Visual Tree я сталкиваюсь с текстовым полем, которое я искал (в тестовом примере), но при использовании

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

be имеет значение null.

Должен ли 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 голосов
/ 27 июля 2011

Хорошо.Разобрались.

В созданном мною примере я работал со стандартными элементами управления Microsoft WPF (TextBox).Итак, эта строка:

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

была правильной.Тем не менее, в приложении для разработки этой функциональности мы работаем с элементами управления DevExpress WPF (TextEdit), которые имеют «общую» другую иерархию наследования.Так что вышеприведенное выражение if никогда не удавалось.

Привязки полностью работоспособны на page_load, как заявляет Microsft: " Стандартное связывание данных (привязка к локальным источникам, таким как другие свойства или напрямую определенные источники данных) будет происходить до Loaded "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...