我使用WPF编写我的界面。我使用ListView作为我的任务列表。任务列表包含两列,FileName,Progress.every绑定到TaskInfo的行:
public class TaskInfo : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public TaskInfo(string fp)
{
FileSystemInfo fsi= new DirectoryInfo(fp);
FileName = fsi.Name;
FilePath = fp;
PbValue = 0;
}
private int pbvalue;
public int PbValue
{
get { return pbvalue; }
set
{
pbvalue = value;
onPropertyChanged("PbValue");
}
}
private string filename;
public string FileName
{
get { return filename;}
set
{
filename = value;
onPropertyChanged("FileName");
}
}
private string filepath;
public string FilePath
{
get { return filepath;}
set
{
filepath = value;
onPropertyChanged("FilePath");
}
}
private void onPropertyChanged(string name)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs(name));
}
}
}
在“进度”列中,它包含ProgressBar,将其值绑定到PbValue。 但是出于某些原因,我应该使用C语言编写的Dll。 我使用的功能是:
WaterErase(char * filepath, int * pbvalue)
我在c#中确定了它:
public extern static void WaterErase(string filepath, ref int pbvalue)
执行多任务,我写了一个线程:
class TaskThread
{
private TaskInfo taskinfo = null; //task information
private Thread thread;
public TaskThread(TaskInfo _taskinfo)
{
taskinfo = _taskinfo;
}
private void run()
{
WaterErase(taskinfo.FilePath, ref taskinfo.PbValue);
}
public void start()
{
if (thread == null)
{
thread = new Thread(run);
thread.Start();
}
}
}
但行:
WaterErase(taskinfo.FilePath, ref taskinfo.PbValue);
有问题:
属性,索引器或动态成员访问权限不能作为out或ref参数传递
我知道为什么会出现这个问题,但是如何解决这个问题来实现这个实时改变PbValue的功能。所以我可以直观地在ProgressBar中执行任务进度
答案 0 :(得分:5)
正如错误所说,你不能那样做。但是您可以使用局部变量:
int temp = taskinfo.PbValue;
WaterErase(taskinfo.FilePath, ref temp);
taskinfo.PbValue = temp;
答案 1 :(得分:2)
你做不到。 ref值的语义不同于“setter”的语义。考虑改为传递Action<T>
。
Action<int> setter = x => ctrl.SomeProp = x;
Something(setter);
然后:
{some loop} {
...
callback(latestValue);
}
然而!还要记住,UI通常不会在循环内更新,除非您使用多个线程并在线程之间进行适当的传递(以上情况不是这样)。