Он находится в DataTemplate, поэтому его нет в коде, как это делают обычные элементы управления. Что вы можете сделать, так это немного изменить этот шаблон и делать все в XAML. Это моя попытка:
<ListBox Grid.Column="0" Grid.Row="0" x:Name="myList" HorizontalContentAlignment="Stretch" ItemsSource="{Binding Items}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Margin="0,2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="auto" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding Name}" />
<ToggleButton x:Name="StartScan" Grid.Column="1" Margin="20,0,0,0" Content="Start" IsChecked="False"/>
<ProgressBar Name="pbStatus" Grid.Column="2" Height="22" Width="50" Minimum="0" Maximum="100">
<ProgressBar.Style>
<Style TargetType="ProgressBar">
<Setter Property="IsIndeterminate" Value="False"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsChecked, ElementName=StartScan}" Value="True">
<Setter Property="IsIndeterminate" Value="True"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ProgressBar.Style>
</ProgressBar>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Что я здесь делаю, так это добавляю стиль к индикатору выполнения. Этот стиль определяет DataTrigger, привязанный к ToggleButton.IsChecked. Как видите, я перешел с Button на ToggleButton, поскольку ToggleButton предоставляет свойство IsChecked. Каждый раз, когда я проверяю кнопку, я устанавливаю для IsIndeterminate значение True.
ИЗМЕНИТЬ - без использования xaml и выполнения этого в коде.
<ListBox Grid.Column="0" Grid.Row="0" x:Name="myList" HorizontalContentAlignment="Stretch" ItemsSource="{Binding Items}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Margin="0,2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="auto" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding Name}" />
<Button x:Name="StartScan" Grid.Column="1" Margin="20,0,0,0" Content="Start" Click="StartScan_Click"/>
<ProgressBar Name="pbStatus" Grid.Column="2" Height="22" Width="50" Minimum="0" Maximum="100"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Мы удаляем все триггеры и сохраняем определение XAML, как и вы. В методе события мы должны получить шаблонный родительский элемент. В нашем случае это презентатор контента, поскольку элемент отображается в ListBox. После этого мы должны получить шаблон и, наконец, получить экземпляр индикатора выполнения из шаблона. Дальше это просто, так как предполагает обычную логику.
private void StartScan_Click(object sender, RoutedEventArgs e)
{
// This is the button
var btn = sender as Button;
// Now we get the template that the button is in.
var contentPresenter = (btn.TemplatedParent as ContentPresenter);
// Finally we find the progress by its name in the template. Also we have to pass the content
// presenter as the second argument since this is where the actual instance of the control is.
var progress = contentPresenter.ContentTemplate.FindName("pbStatus", contentPresenter) as ProgressBar;
// Do your logic normally as you would.
progress.IsIndeterminate = !progress.IsIndeterminate;
btn.Content = progress.IsIndeterminate ? "Stop" : "Start";
}
11.02.2020