Ссылка на TextBox внутри DataTemplate - PullRequest
1 голос
/ 21 декабря 2009

Как получить ссылку на TextBox, который определен только внутри DataTemplate (при условии, что я только что применил этот DataTemplate к некоторой ячейке в сетке).

Пока я использую отправителя в событиях TextBox, чтобы получить это.

Спасибо, Руи

Ответы [ 3 ]

2 голосов
/ 22 декабря 2009

Для получения ссылки на элемент управления в шаблоне данных обработка события, а затем использование отправителя является одним из доступных вариантов. Есть еще один вариант, который вы можете попробовать:

в .xaml:

    <toolkit:DataGrid Name="datagrid" Margin="0,0,0,28" AutoGenerateColumns="False">
        <toolkit:DataGrid.Columns>
            <toolkit:DataGridTextColumn Header="First Name" Binding="{Binding FirstName}"/>
            <toolkit:DataGridTemplateColumn Header="Last Name">
                <toolkit:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBox Text="{Binding LastName}"/>
                    </DataTemplate>
                </toolkit:DataGridTemplateColumn.CellTemplate>
            </toolkit:DataGridTemplateColumn>
        </toolkit:DataGrid.Columns>
    </toolkit:DataGrid>
    <Button Height="22" VerticalAlignment="Bottom" Click="Button_Click" />

в .xaml.cs

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        InitializeMouseHandlersForVisual(datagrid);
    }

    public void InitializeMouseHandlersForVisual(Visual visual)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(visual); i++)
        {
            Visual childVisual = (Visual) VisualTreeHelper.GetChild(visual, i);
            if (childVisual is TextBox)
                MessageBox.Show("textbox Found");
            // Recursively enumerate children of the child visual object.

            InitializeMouseHandlersForVisual(childVisual);
        }
    }

Надеюсь, это поможет !!

Edit:

если вы хотите использовать x: Name, то вам также нужно как минимум получить ContentPresenter, а для получения ContentPresenter вам нужно пройти через дерево элементов. Вам необходимо сделать следующие обновления:

в .xaml:

    <DataTemplate>
        <TextBox x:Name="text" Text="{Binding LastName}"/>
     </DataTemplate>

в .xaml.cs

    public void InitializeMouseHandlersForVisual(Visual visual)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(visual); i++)
        {
            Visual childVisual = (Visual) VisualTreeHelper.GetChild(visual, i);
            ContentPresenter myContentPresenter = childVisual as ContentPresenter;
            if (myContentPresenter != null)
            {
                // Finding textBlock from the DataTemplate that is set on that ContentPresenter
                DataTemplate myDataTemplate = myContentPresenter.ContentTemplate;
                if (myDataTemplate != null)
                {
                    TextBox myTextBox = (TextBox)myDataTemplate.FindName("text", myContentPresenter);
                    MessageBox.Show("textbox Found");
                }
            }
            InitializeMouseHandlersForVisual(childVisual);
        }
    }

Надеюсь, это поможет !!

1 голос
/ 22 декабря 2009

Извините, но вы делаете это неправильно.
Нет веской причины, по которой у вас должна быть ссылка на элементы внутри IMO DataTemplate. Более того, у вас действительно нет веских причин для того, чтобы когда-либо регистрироваться на контрольное событие.

В рамках архитектуры MVVM мы начали изучать данные и взаимодействия.
На стороне данных - все привязано к ViewModel.
На стороне взаимодействия - Использование ICommands все события связаны для команд.

Итак, в вашем примере с TextBox - почему вы слушаете события текстового поля? Используйте TwoWay DataBinding, чтобы узнать, когда текст TextBox изменяется.
В другом примере, какие события оправданы, например, button.Click? Используйте Button.Command = "{Binding myCommand}", чтобы команды обрабатывали события.

Причина, по которой вы сталкиваетесь с проблемами, заключается в том, что вы пытаетесь протолкнуть круглый колышек в квадратное отверстие.

- Джастин

0 голосов
/ 14 января 2013

Я согласен с Джастином.

Но если по какой-то причине связывание с каким-либо свойством проблематично и вам все еще нужна ссылка на элемент управления внутри шаблона данных в SILVERLIGHT (указанное выше решение подходит для компонентов WPF), вы можете сделать следующее:

TextBox textBox = null;

   if (datagrid.SelectedItem != null)
      textBox = datagrid.Columns[1].GetCellContent(datagrid.SelectedItem) as TextBox;

   if (textBox != null)
      MessageBox.Show(textBox.Text);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...