我不知道是否可能,但我想要的是这样的
在WinForm
listbox1
中有一个行列表(从文件中复制)
在另一个Thread和类中,我运行在一个List上,每行包含相同的行,DoSomething
一旦我完成该行,我希望列表框中的索引更改
从我的基本和有限的理解,我的方法是使用Event
来激活形式,而不是使用Invoke(不用于交叉线程)
是否有办法以某种方式以listbox
循环绑定到for/foreach
的索引?
class form
{
listBoxScript.SetSelected(ScriptCounter, true);<--bind the ScriptCounter?
}
在另一个班级
class RunScript
{
//..
public void RunScriptList()
{
ScriptCounter = 0 ;
foreach ( var cell in ScriptList)
{
ScriptCounter ++;
//DoSomething
}
}
}
答案 0 :(得分:2)
确保在INotifyPropertyChanged
课程中实施RunScript
。这是一个完整的样本:
class RunScript : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private int scriptCounter;
private ISynchronizeInvoke invoker;
public RunScript(ISynchronizeInvoke invoker)
{
if (invoker == null) throw new ArgumentNullException("invoker");
this.invoker = invoker;
}
public async void RunScriptList()
{
ScriptCounter = 0;
foreach (var cell in Enumerable.Range(1, 15))
{
ScriptCounter++;
await Task.Delay(1000);
//DoSomething
}
}
public int ScriptCounter
{
get { return scriptCounter; }
set
{
scriptCounter = value;
OnPropertyChanged();
}
}
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
var handler = PropertyChanged;
if (handler != null)
{
Action action = () => handler(this, new PropertyChangedEventArgs(propertyName));
invoker.Invoke(action, null);
}
}
}
private RunScript rs;
public Form1()
{
InitializeComponent();
rs = new RunScript(this)
var binding = new Binding("SelectedIndex", rs, "ScriptCounter", false, DataSourceUpdateMode.OnPropertyChanged);
listBox1.DataBindings.Add(binding);
}
private void button1_Click(object sender, EventArgs e)
{
rs.RunScriptList();
}
注意我在async/await
中使用了RunScriptList
,如果你在另一个线程中执行它,则需要在主线程中触发PropertyChanged
事件以避免跨线程异常。