绑定列表框以索引C#
我不知道是否可能,但我想要的是类似的东西在WinForm
listbox1
有一个行列表(从文件复制)
在另一个Thread和类中,我在一个List上运行,该列包含我解析的每一行相同的行和DoSomething
一旦我完成该行,我希望列表框中的索引改变
根据我的基本和有限的理解,我的方法是使用一个Event
来激活forms,而不是使用Invoke(不用于交叉线程)
有没有办法以某种方式以我的for/foreach
循环以某种方式绑定到listbox
索引?
class form { listBoxScript.SetSelected(ScriptCounter, true);<--bind the ScriptCounter? }
在另一个class级
class RunScript { //.. public void RunScriptList() { ScriptCounter = 0 ; foreach ( var cell in ScriptList) { ScriptCounter ++; //DoSomething } } }
确保在RunScript
类中实现INotifyPropertyChanged
。 这是一个完整的示例:
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(); }
注意我在RunScriptList
使用了async/await
,如果你在另一个线程中执行它,你需要在主线程中触发PropertyChanged
事件以避免跨线程exception。