[英]bind listbox to index C#
我不知道是否可能,但是我想要的是這樣的東西:在WinForm
listbox1
有一個行列表(從文件復制)
在另一個線程和類中,我在一個List上運行,該List包含相同的行,我解析的每一行和DoSomething
一旦完成該行,我都希望列表框中的索引發生變化
從我的基本和有限的理解出發,我的方法是使用Event
來觸發表單,而不是使用Invoke(因為不要跨線程)
有沒有辦法通過for/foreach
循環以某種方式綁定到listbox
索引?
class form
{
listBoxScript.SetSelected(ScriptCounter, true);<--bind the ScriptCounter?
}
在另一堂課
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
事件,以避免跨線程異常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.