Hei,WPF DataGrid đang thêm hàng "ma" bổ sung
Trong ứng dụng của tôi, tôi đang sử dụng DataGrid để hiển thị một số dữ liệu. Để có được tất cả mọi thứ làm việc với luồng tôi đang sử dụng AsyncObservableCollection
như DataContext của DataGrid. Khi ứng dụng của tôi bắt đầu, nó sẽ tìm kiếm các tệp trong một số thư mục và cập nhật AsyncObservableCollection
. Tìm file được thực hiện trên một thread riêng biệt:
Task.Factory.StartNew(() => _cardType.InitAllOrdersCollection())
.ContinueWith((t) => ThrowEvent(), TaskContinuationOptions.None);
đâu tất cả các logic tải là trong InitAllOrdersCollection()
phương pháp.
Bây giờ đây là nơi mọi thứ trở nên xấu, khi tôi khởi động ứng dụng vì lý do nào đó tôi nhận được 2 hàng có cùng dữ liệu trong DataGrid ngay cả khi có một mục trong bộ sưu tập và chỉ một tệp trong thư mục. Nếu tôi thêm độ trễ (tối thiểu Thread.Sleep()
50ms) trước khi tải tệp thì DataGrid hiển thị mọi thứ chính xác (không có hàng bổ sung). Trì hoãn phải được thêm vào Chủ đề những gì đang tải các tập tin (Một trong những tạo ra với Task.Factory.StartNew()
).
Có ai gặp phải điều gì đó tương tự hoặc có điều gì khác tôi nên thử không? Cảm ơn bạn trước!
EDIT: Thêm một số mã như yêu cầu:
public AsyncObservableCollection<IGridItem> OrdersCollection = new AsyncObservableCollection<IGridItem>();
public void InitAllOrdersCollection()
{
// Thread.Sleep(50); <-- this sleep here fixes the problem!
foreach (var convention in FileNameConventions)
{
var namePatterns = convention.NameConvention.Split(',');
foreach (var pattern in namePatterns)
{
var validFiles = CardTypeExtensions.GetFiles(this.InputFolder, pattern, convention);
if (validFiles.Any())
{
this.FilesToOrders(validFiles, convention);
}
}
}
}
public static List<string> GetFiles(string inputFolder, string pattern, FileNameConvention convention)
{
var files = Directory.GetFiles(inputFolder, pattern);
return files.Where(file => IsCorrect(file, convention)).AsParallel().ToList();
}
// Adds new order to OrdersCollection if its not there already!
private void FilesToOrders(List<string> dirFiles, FileNameConvention convention)
{
foreach (var dirFile in dirFiles.AsParallel())
{
var order = new Order(dirFile, this, convention);
if (!this.OrdersCollection.ContainsOrder(order))
{
this.OrdersCollection.Add(order);
}
}
}
public static bool ContainsOrder(this ObservableCollection<IGridItem> collection, Order order)
{
return collection.Cast<Order>().Any(c=>c.Filepath == order.Filepath);
}
FilesToOrders()
phương pháp là một trong những bổ sung thêm các đơn đặt hàng mới đến AsyncObservableCollection
. Hy vọng điều này sẽ hữu ích.
Ông có thể thêm một số chi tiết về phương pháp InitAllOrdersCollection? Tôi đã tạo một chương trình thử nghiệm đơn giản và tôi không nhận được bất kỳ bản sao nào. Có lẽ có cái gì đó trong bạn mã mà tôi không làm để nhân rộng loại hành vi này. –
Tôi nghi ngờ vấn đề đã làm với điều khiển lưới dữ liệu. Kiểm tra nội dung trong 'OrdersCollection' - logic của bạn có thể đang đặt một số" mẫu trống "trong bộ sưu tập. Ngoài ra, tại sao bạn lặp lại thông qua 'dirFiles.AsParallel()' thay vì chỉ 'dirFiles'? Có hoạt động tốn thời gian nào trong vòng lặp đó không? –
OrderCollection chỉ chứa đúng số lượng mục, tôi đã kiểm tra nhiều lần, nhưng chúng vẫn được hiển thị gấp đôi trong DataGrid. Dưới đây là một số thông tin thêm về [AsParallel()] (http://www.albahari.com/threading/part5.aspx#_PLINQ). Ok, có thể gọi AsParallel() ở những nơi không làm gì cả, nhưng đó không phải là vấn đề ở đây .. – hs2d