There are several ways to do it. One could be:
<Window x:Class="SO41749207.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:SO41749207"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<StackPanel Orientation="Vertical">
<TextBox Text="{Binding ElementName=MyProgress, Path=Value}" />
<ProgressBar Name="MyProgress" Value="50" />
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid>
<ListBox>
<ListBoxItem>a</ListBoxItem>
<ListBoxItem>b</ListBoxItem>
<ListBoxItem>c</ListBoxItem>
</ListBox>
</Grid>
</Window>
A more MVVM-like approach is to define a view model for the list items:
public class MyListItem : INotifyPropertyChanged
{
double m_progressValue = 0.0;
public double ProgressValue
{
get { return m_progressValue; }
set
{
m_progressValue = value;
OnPropertyChanged("ProgressValue");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string property)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}
}
... and a corresponding DataTemplate:
<DataTemplate DataType="{x:Type models:MyListItem}">
<StackPanel Orientation="Vertical">
<TextBox Text="{Binding ProgressValue}" HorizontalAlignment="Center" Width="50" TextAlignment="Center" />
<ProgressBar Value="{Binding ProgressValue}" />
</StackPanel>
</DataTemplate>
... for the list items:
<ListBox HorizontalContentAlignment="Stretch">
<ListBox.ItemsSource>
<cols:ArrayList>
<models:MyListItem ProgressValue="10" />
<models:MyListItem ProgressValue="50" />
<models:MyListItem ProgressValue="80" />
</cols:ArrayList>
</ListBox.ItemsSource>
</ListBox>