Aaginor
Aaginor

Reputation: 4782

Access ListBoxItem-Controls from code-behind

in my Silverlight 4 application I have a listbox for which I created an itemtemplate:

    <DataTemplate x:Key="ItemTemplate">
        <Grid Background="{StaticResource BrushCharacteristicListBoxItemBackground}">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="10"/>
                <ColumnDefinition Width="Auto"/>
            </Grid.ColumnDefinitions>
            <TextBlock x:Name="TextBlockCharacteristicName" Text="{Binding Name}" TextTrimming="WordEllipsis" ToolTipService.ToolTip="{Binding Name}" Margin="6,0,2,0" VerticalAlignment="Center" HorizontalAlignment="Left" />
            <TextBlock x:Name="TextBlockSeperator" Text="=" Grid.Column="1" VerticalAlignment="Center" />
            <Border Grid.Column="2" HorizontalAlignment="Right" Margin="2,2,6,2" Background="{Binding FunctionState, Converter={StaticResource ConvertCharacteristicFunctionState2Color}}">
                <TextBlock x:Name="TextBlockCharacteristicValue" Text="{Binding CalculatedValue, Converter={StaticResource ConvertDouble2Display}}" Padding="2,0" Foreground="{StaticResource BrushCharacteristicListBoxItemBackground}" ToolTipService.ToolTip="{Binding ValueOrFunc}" MaxWidth="72"/>
            </Border>
        </Grid>
    </DataTemplate>     

Now I want to access the Controls defined in the template (i.e. TextBlockCharacteristicName) from the code behind. I need this to manually adapt the size of the Controls, which can't be done in an other way.

I hooked into the LayoutUpdated event, but did not found a way to access the controls. I have tried it with

((StackPanel)ListBoxCharacteristics.GetItemsHost()).Children

which gives me a the list of the ListBoxItems, but there seems to be no way to get the controls from there. Can anyway help me out with this problem?

Thanks in advance,
Frank

Upvotes: 1

Views: 963

Answers (1)

AnthonyWJones
AnthonyWJones

Reputation: 189457

Get the small VisualTreeEnumeration chunk of code from this blog: Visual Tree Enumeration.

Now you can find your "TextBlockCharacteristicName" elements with this code:-

foreach (var textBlock in ListBoxCharacteristics.Descendents()
    .OfType<TextBlock>()
    .Where(t => t.Name == "TextBlockCharacteristicName") )
{
    // Do stuff with each Text block.
}

Upvotes: 2

Related Questions