Инкремент счетчика в реальном времени из текстового поля - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть приложение WPF, которое зацикливает в Codebehind данные и увеличивает счетчик для каждого найденного элемента.

Теперь я хотел бы отобразить счетчик приращений в реальном времени в качестве обратной связи с пользователем.

Все, что я сейчас получаю, это значение после завершения моей задачи, потому что нам нужно запустить его в ожидании Задача.

Нажатие кнопки запускает метод, который зацикливает мои данные.

Могу ли я обновить счетчик в моем Xaml, если мой метод работает, а не после завершения?

Форма решения mm8:

Код позади:

public partial class UserControlCounter : UserControl, INotifyPropertyChanged
{
    private int _scanStatusCounter;
    public int ScanStatusCounter
    {
        get { return _scanStatusCounter; }
        set { _scanStatusCounter = value; NotifyPropertyChanged(); }
    }

    public UserControlCounter()
    {
        InitializeComponent();
        DataContext = this;
    }

    private async void Button_Click(object sender, RoutedEventArgs e)
    {

        await Task.Run(getAll);
        scanStatus.Text = "Persons " + ScanStatusCounter.ToString();
    }


    private async void getAll()
    {
        //grab data and iterate it
        string[] string_array = new string[] { "a", "b", "c", "d", "e" }; // type = System.String[]

        foreach (var i in string_array)
        {

            ScanStatusCounter++;
            await Task.Delay(100);
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

Вот мой Xaml для элемента управления:

    <Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <TextBlock Grid.Row="0" Grid.Column="0" x:Name="scanStatus" Text="{Binding Path=ScanStatusCounter, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></TextBlock>
    <Button Grid.Row="0" Grid.Column="1" Click="Button_Click"> Click Me</Button>
</Grid>

спасибо

Обновлено рабочее решение добавлено. Заранее благодарим mm8 за мою руку!

1 Ответ

2 голосов
/ 17 февраля 2020

Реализуйте INotifyPropertyChanged и сделайте scanStatusCounter свойством:

public partial class UserControlCounter : UserControl, INotifyPropertyChanged
{
    private int _scanStatusCounter;
    public int ScanStatusCounter
    {
        get { return _scanStatusCounter; }
        set { _scanStatusCounter = value; NotifyPropertyChanged(); }
    }

    public UserControlCounter()
    {
        InitializeComponent();
    }

    private async void Button_Click(object sender, RoutedEventArgs e)
    {
        var btn = sender as Button;
        var contentPresenter = (btn.TemplatedParent as ContentPresenter);

        var ppStatusCounter = contentPresenter.ContentTemplate.FindName("scanStatus", contentPresenter) as TextBlock;

        await Task.Run(getAll);
        ppStatusCounter.Text = "Persons " + ScanStatusCounter.ToString();
    }


    private static async void getAll()
    {
        //grab data and iterate it

        foreach (var result in data)
        {
            ScanStatusCounter++;
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

Вы также можете добавить некоторую задержку в l oop, чтобы реально видеть увеличение счетчика:

private static async void getAll()
{
    //grab data and iterate it

    foreach (var result in data)
    {
        ScanStatusCounter++;
        await Task.Delay(100);
    }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...