スレッド内のDataGridにアイテムを追加したい。Dispatcher:ディスパッチャ操作を中止する
は、私は私のユーザーコントロールのビューモデルを持っている:
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);
}
}
マークアップの例があります:
Updateメソッドが二度目に実行された後<!--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には、最初のコレクションの一部と完全な2番目のコレクションが含まれます。
私はDispatcherOperationを中止しようとしますが、Itemsプロパティに連絡先を追加することは停止しません。
DataGrid ItemsSourceにオブジェクトを追加する正しい方法を教えてください。あなたはcontactList1内のすべての項目のDispatcher.BeginInvoke()
を開始していますが、Update(contactList2)
を入力した場合にのみ、完全なforeachのが、単一Items.Add()
ないLastOperation、いったん中止し、あなたのUpdate(contactList1)
方法で
Abort()は何を返しますか?最初のコレクションのどの部分が残っていますか? – LPL
@LPLはtrueを返します。最初のコレクションの最後の部分は残ります。 – ebashmakov