我想在线程中添加项目到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>在第二次执行Update方法后,如果第一个集合没有完全添加,则DataGrid将包含第一个集合的一部分和第二个集合的全部。
// contactList1 and contactList2 are IEnumerable<Contact> objects
Model.Update(contactList1);
Model.Update(contactList2);我尝试中止DispatcherOperation,但没有停止将联系人添加到Items属性中。
您能告诉我向DataGrid ItemsSource添加对象的正确方法吗?
发布于 2012-04-27 12:55:31
你应该收集列表中的所有DispatcherOpretations,然后中止它们。
public class ContactGridViewModel
{
public ContactGridViewModel()
{
Items = new ObservableCollection<Contact>();
LastOperations = new List<DispatcherOperation>();
}
public ObservableCollection<Contact> Items { get; private set; }
private ICollection<DispatcherOperation> LastOperations { get; set; }
public Dispatcher Dispatcher
{
get { return Dispatcher.CurrentDispatcher); }
}
private void StopUpdating()
{
foreach (var operation in LastOperations)
{
operation.Abort();
}
LastOperations.Clear();
}
public void Update(IEnumerable<Contact> contacts)
{
StopUpdating();
Items.Clear();
foreach (var item in contacts)
LastOperations.Add(Dispatcher.BeginInvoke(
DispatcherPriority.Background,
new ParameterizedThreadStart(o => Items.Add(item))),
item));
}
}发布于 2012-04-27 01:35:26
在您的Update(contactList1)方法中,您为contactList1中的每一项启动一个Dispatcher.BeginInvoke(),但是如果您输入Update(contactList2),则只中止一次LastOperation,这不是完整的foreach,而是单个Items.Add()。
尝试如下所示(未经过测试):
public void Update(IEnumerable<Contact> contacts)
{
if (LastOperation != null) LastOperation.Abort();
Items.Clear();
LastOperation = Dispatcher.BeginInvoke(
DispatcherPriority.Background,
new ParameterizedThreadStart(o => { foreach (var item in o) Items.Add(item); }),
contacts);
}https://stackoverflow.com/questions/10334497
复制相似问题