Udo
Udo

Reputation: 21

How to access a TextBlock within a ListBox with C#

For most of you, this might be an easy question, but I am a C# beginner (coming from VB) and would like to progam a Windows Phone App.

The question is: How can I access the TextBlock "LineOne" from code to change its width? For the page title, it works perfect with this (on orientation change):

this.PageTitle.Text = "Portrait";

However, something like this:

this.LineOne.width= "50";

won't work. Why?

My XAML looks like this (almost the default data bound app from Visual Studio Express):

    <!--TitlePanel -->
    <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
        <TextBlock x:Name="PageTitle" Text="Bundesliga" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
    </StackPanel>

    <!--ContentPanel -->
    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <ListBox x:Name="MainListBox" Margin="0,0,-12,0" ItemsSource="{Binding Items}" SelectionChanged="MainListBox_SelectionChanged">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel x:Name="ListboxPanel" Margin="0,0,0,17" Width="432" Orientation="Horizontal">
                        <TextBlock x:Name="LineOne" Text="{Binding LineOne}" TextWrapping="Wrap" Style="{StaticResource  PhoneTextNormalStyle}" Width="40" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>

Thanks for your help!

Upvotes: 2

Views: 2469

Answers (3)

Matt Lacey
Matt Lacey

Reputation: 65586

The name can't be resolved as belonging to this as it belongs to the datatemplate. You can't refer to an item within a template (from outside that template) as there could be multiple items with that name and names must be unique.

If you are trying to change the style of the selected item you will likely find a better solution to be to use different visual states to represent this.

If you are trying to access a property which relates to the bound viewmodel you can cast the sender to the type of the viewmodel and access it's properties directly.

Upvotes: 0

Marko
Marko

Reputation: 11002

IEnumerable<TextBlock> listtb = ListboxPanel.Items.TypeOf<TextBlock>(); 

Upvotes: 0

Filipe Miguel
Filipe Miguel

Reputation: 519

You have to access the TextBlocks inside the listbox. Something like:

TextBlock textblock = ListboxPanel.Items[index] as TextBlock;
textblock.Width = 50

Upvotes: 2

Related Questions