gpt4 book ai didi

c# - 从线程MVVM更新进度栏

转载 作者:行者123 更新时间:2023-12-03 10:27:51 24 4
gpt4 key购买 nike

我是MVVM模式的新手。我从另一个线程更新进度栏时遇到问题。

View.Xaml


<ProgressBar Value="{Binding ProgressBarValue}">

ViewModel.cs


public int ProgressBarValue 
{
get
{
return status;
}
set
{
this.status = value;
this.RaisePropertyChanged(() => this.ProgressBarValue);
}
}


Thread th;

private void OnOk()
{
th=new Thread(new ThreadStart(StartProcess));
}

private void StartProcess()
{
utilityclass.DoWork();
}

UtilityClass.cs


public void DoWork()
{
for(i=0;i<100;i++)
{
//dosomething
}
}

我的问题是如何将DoWork方法的进度更新到 View ?我通过使用后台 worker 类找到了许多解决方案。但是由于某些原因,我无法遵循这些方法。我真的需要这里的帮助。

最佳答案

我只是将ProgressChanged事件添加到UtilityClass中。

class UtilityClass
{
public event EventHandler<ProgressChangedEventHandler> ProgressChanged;

public class ProgressChangedEventHandler : EventArgs
{
public int Progress
{
get;
private set;
}

public ProgressChangedEventHandler(int progress)
{
Progress = progress;
}
}

public void DoWork()
{
for (int i = 0; i < 100; i++)
{
Thread.Sleep(300);

if (ProgressChanged != null)
ProgressChanged(this, new ProgressChangedEventHandler(i));
}
}
}

然后,您可以在 View 模型中订阅此事件,并在每次引发事件时更新属性值。
    public ShellViewModel()
{
utilityclass = new UtilityClass();
utilityclass.ProgressChanged += utilityclass_ProgressChanged;
}

void utilityclass_ProgressChanged(object sender, UtilityClass.ProgressChangedEventHandler e)
{
ProgressBarValue = e.Progress;
}

哦,请注意,您实际上应该启动线程!我认为此方法可能需要公开。
    public void OnOk()
{
th = new Thread(new ThreadStart(StartProcess));
th.Start();
}

另外,当用户关闭表单时,您可能想中止此线程。

此代码将取决于您的MVVM框架。在这里,我使用的是从Caliburn.Micro的 Screen类派生的 View 模型,因此我可以覆盖 OnDeactivate方法并在那里关闭线程。
    protected override void OnDeactivate(bool close)
{
if (close)
{
th.Abort();
}
}

关于c# - 从线程MVVM更新进度栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30320030/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com