WedX - журнал о программировании и компьютерных науках

Добавить индикатор выполнения в DataTemplate ListBox ItemTemplate в WPF, но не существует в текущем контексте?

Я хотел бы установить индикатор выполнения onClick в моем UserControl на IsIndeterminate = "True", если я нажму кнопку StartScan.

В моем пользовательском элементе управления есть следующий xaml:

<ListBox Grid.Column="0" Grid.Row="0" x:Name="myList" HorizontalContentAlignment="Stretch">
    <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" Click="Start_Click" Margin="20,0,0,0">Start</Button>
                    <ProgressBar Name="pbStatus" Grid.Column="2" Height="22" Minimum="0" Maximum="100" IsIndeterminate="True" />
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
</ListBox>

но все, что я получаю, - это psbStatus does not exist in the current context, которое исчезло после того, как я добавил: ProgressBar pbStatus = new ProgressBar(); в свой userControl.

Но я все еще не могу получить доступ к таким свойствам, как IsIndeterminate или Visibility. Например, чтобы показать или скрыть индикатор выполнения.

11.02.2020

Ответы:


1

Он находится в 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
  • Мне больше всего нравится решение с Codebehind, спасибо за ваше время. 13.02.2020
  • Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]