实时从文本框中的代码后面递增计数器



我有一个WPF应用程序,它在Codebehin中通过数据循环,并为每个找到的元素增加一个计数器。

现在,我想将实时递增计数器显示为对用户的状态反馈。

我现在得到的只是任务完成后的值,因为我们需要将其作为等待任务运行。

Button Click触发循环我的数据的方法。

如果我的方法运行而不是在完成之后,我可以更新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牵着我的手

实现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));
}
}

您可能还想在循环中添加一些延迟,以便能够实际看到计数器的增量:

private static async void getAll()
{
//grab data and iterate it
foreach (var result in data)
{
ScanStatusCounter++;
await Task.Delay(100);
}
} 

最新更新