我想在線程中向DataGrid添加項目。調度員:中止調度程序操作
我有我的用戶控制視圖模型:
public class Contact
{
public string Name { get; set; }
public string Phone { get; set; }
}
public class ContactGridViewModel
{
public ContactGridViewModel()
{
Items = new ObservableCollection<Contact>();
}
public ObservableCollection<Contact> Items { get; private set; }
public Dispatcher Dispatcher
{
get { return Dispatcher.CurrentDispatcher); }
}
private DispatcherOperation LastOperation { get; set; }
public void Update(IEnumerable<Contact> contacts)
{
if (LastOperation != null) LastOperation.Abort();
Items.Clear();
foreach (var item in contacts)
LastOperation = Dispatcher.BeginInvoke(
DispatcherPriority.Background,
new ParameterizedThreadStart(o => Items.Add(o))),
item);
}
}
有標記示例:
<!--DataContext="{Binding ContactGridViewModel}-->
<DataGrid ItemsSource="{Binding Items, Mode=OneWay}">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Path=Name}" />
<DataGridTextColumn Header="Phone" Binding="{Binding Path=Phone}" />
</DataGrid.Columns>
</DataGrid>
後更新方法執行第二次,如果第一次收集不完全加入, DataGrid將包含第一個集合和第二個集合的一部分。
// contactList1 and contactList2 are IEnumerable<Contact> objects
Model.Update(contactList1);
Model.Update(contactList2);
我嘗試中止DispatcherOperation,但它不停止將聯繫人添加到Items屬性中。
你能告訴我將對象添加到DataGrid ItemsSource的正確方法嗎?
Abort()返回什麼?首先還是最後一部分的第一部分仍然存在? – LPL 2012-04-26 15:25:34
@LPL它返回true。第一次收集的最後部分仍然存在。 – ebashmakov 2012-04-26 17:07:24