Link to TextBox inside DataTemplate

How to get a link to a TextBox, which is defined only inside the DataTemplate (if I just applied this DataTemplate to some cell in the grid).

For now, I am using the sender in TextBox events to get this.

Thanks Rui

+1
source share
3 answers

To obtain a reference to a control inside a data template, processing an event and then using the sender is one of the available options. There is another option you can try:

in .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" />

in .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);
        }
    }

Hope this helps!

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);
        }
    }

, !

+2

, .
, DataTemplate IMO. , .

MVVM .
- ViewModel. - ICommands .

, TextBox - ? TwoWay DataBinding, , TextBox .
, , button.Click? Button.Command = "{Binding myCommand}", .

, , , .

-

+1

.

- , 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);
0
source

Source: https://habr.com/ru/post/1729584/


All Articles