Search code examples
c#listviewuwptextblock

How to change the value of a TextBlock contained in a header of a listview?


I have a Listview with just the header set to display totals from another list. How do I access Textblock tbkValue to change its Text property?

<ListView x:Name="lvwTotals" Margin="1,0,3,3" ScrollViewer.HorizontalScrollBarVisibility="Auto" >
                    <ListView.ItemContainerStyle>
                        <Style TargetType="ListViewItem">
                            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
                        </Style>
                    </ListView.ItemContainerStyle>
                    <ListView.HeaderTemplate>
                        <DataTemplate>
                            <Grid Padding="12" Margin="3,5,1.5,5" Background="{ThemeResource SystemBaseLowColor}">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="*"/>
                                    <ColumnDefinition Width="30"/>
                                    <ColumnDefinition Width="30"/>
                                    <ColumnDefinition Width="30"/>
                                    <ColumnDefinition Width="30"/>
                                    <ColumnDefinition Width="70"/>
                                    <ColumnDefinition Width="70"/>
                                </Grid.ColumnDefinitions>
                                <TextBlock Grid.Column="0" x:Uid="PlayPgTbkTotals" TextWrapping="NoWrap" FontSize="12" />
                                <TextBlock Grid.Column="1" x:Name="tbkValue" TextWrapping="NoWrap" FontSize="12" />
                                <TextBlock Grid.Column="2" TextWrapping="NoWrap" FontSize="12" />
                                <TextBlock Grid.Column="3" TextWrapping="NoWrap" FontSize="12" />
                                <TextBlock Grid.Column="4" TextWrapping="NoWrap" FontSize="12" />
                                <TextBlock Grid.Column="5" TextWrapping="NoWrap" FontSize="12" />
                                <TextBlock Grid.Column="6" TextWrapping="NoWrap" FontSize="12" />
                            </Grid>
                        </DataTemplate>
                    </ListView.HeaderTemplate>
                </ListView>

Solution

  • A simple way to do this is to use the VisualTreeHelper Class.

    Code-behind:

     private void Button_Click(object sender, RoutedEventArgs e)
        {
            var textblcok = MyFindChildByName(lvwTotals, "tbkValue") as TextBlock;
            textblcok.Text = "New Content";
        }
    
        public static DependencyObject MyFindChildByName(DependencyObject parant, string ControlName)
        {
            int count = VisualTreeHelper.GetChildrenCount(parant);
    
            for (int i = 0; i < count; i++)
            {
                var MyChild = VisualTreeHelper.GetChild(parant, i);
                if (MyChild is FrameworkElement && ((FrameworkElement)MyChild).Name == ControlName)
                    return MyChild;
    
                var FindResult = MyFindChildByName(MyChild, ControlName);
                if (FindResult != null)
                    return FindResult;
            }
    
            return null;
        }