2012-05-12 70 views
2

我使用WPF来编写我的界面。我用的ListView我的任务list.Task列表包含两列,文件名,Progress.every行绑定到TASKINFO:如何在c中使用ref属性#

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

在进度列,它包含一个进度条,结合其值设置为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); 

has probl EM:

的属性,索引器或动态成员访问不可能会作为传出或引用参数

我知道为什么这个问题出现了,但如何解决这个问题,以实现这一功能被传递即实时更改PbValue。所以我可以直观地在ProgressBar中执行任务进度

回答

5

正如错误所述,你不能那样做。但你可以使用一个局部变量:

int temp = taskinfo.PbValue; 
WaterErase(taskinfo.FilePath, ref temp); 
taskinfo.PbValue = temp; 
+0

但是不会显示实时进度。当WaterErase函数完成时,ProgressBar的值将直接变为100 – cloudending

2

你不能。 ref值的语义不同于“setter”的语义。考虑改为传递Action<T>

Action<int> setter = x => ctrl.SomeProp = x; 
Something(setter); 

然后:

{some loop} { 
    ... 
    callback(latestValue); 
} 

但是!另外请记住,UI通常不会在循环内更新,除非您使用多个线程并在线程之间进行适当的传递(以上不是)。

+0

我认为本地函数的签名在这里给出,它不会接受委托。 – svick

+0

@svick够公平的。这使得答案更简单:“否” –

+0

或者您是否对Dll有一些建议? – cloudending