2010-07-19 9 views
10

Trong Silverlight 4 tôi có một lớp dịch vụ tùy chỉnh có sự kiện hoàn thành không đồng bộ. Bên trong sự kiện hoàn thành Tôi lấy dữ liệu trả về và gọi một phương pháp populate qua một cái gì đó như thế này:Dispatcher.Invoke với các tác phẩm đại biểu ẩn danh trong Silverlight nhưng không WPF

private void service_Completed(object sender, CompletedEventArgs args) 
{ 
    Dispatcher.BeginInvoke(() => populateInbox(args.Jobs)); 
} 

private void populateInbox(List<JobViewModel> jobs) 
{ 
    inbox.DataContext = jobs; 
} 

Các BeginInvoke công trình trong SL4, tuy nhiên khi tôi chuyển nó vào WPF tôi nhận được lỗi sau:

Cannot convert lambda expression to type 'System.Delegate' because it is not a delegate type

tôi đã cố gắng thay đổi nó vào một nội dòng, mang tính chất đại biểu paramaterized:

Dispatcher.BeginInvoke(delegate(List<JobViewModel> jobs) 
{ 
    inbox.DataContext = jobs; 
}); 

Tuy nhiên, đó mang lại cùng một lỗi thời gian biên dịch.

Bất kỳ ý tưởng làm thế nào để có được điều này để làm việc trong WPF? Việc tái cấu trúc để sử dụng số BackgroundWorker không phải là một lựa chọn cho tôi.

Trả lời

26

Bạn cần chỉ định loại đại biểu rõ ràng. Chỉ cần sử dụng Action.

Dispatcher.BeginInvoke(new Action(() => populateInbox(args.Jobs)); 

Bạn có thể, tuy nhiên, tránh phải đóng hơn giá trị args.Jobs như thế này:

Dispatcher.BeginInvoke(new Action((jobs) => populateInbox(jobs)), jobs); 

Điều này là do phiên bản đơn tham số của Dispatcher.BeginInvoke có một chữ ký khác nhau trong Silverlight hơn trong WPF. Trong Silverlight, phải mất một Action, cho phép trình biên dịch C# để ngầm loại lambda của bạn dưới dạng Action. Trong WPF, phải mất một Delegate (giống như Control.BeginInvoke tương tự của nó trong Winforms), do đó trình biên dịch C# phải có một loại đại biểu được chỉ định rõ ràng.

+0

Tôi nhận được lỗi này ngay bây giờ: Một tham chiếu đối tượng là cần thiết cho không tĩnh lĩnh vực, phương pháp, hoặc tài sản 'System.Windows.Threading.Dispatcher.BeginInvoke (System.Delegate, params object []) '. Tôi tách nó ra thành 2 dòng để thử và xem điều gì gây ra lỗi. var d = new Action (() => populateInbox (args.Jobs)); Dispatcher.BeginInvoke (d, args.Jobs); Lỗi xảy ra trên dòng thứ hai. –

+0

Dispatcher.BeginInvoke (d, đối tượng mới [] {args.Jobs}); Không hoạt động. –

+1

@Edward: 'Dispatcher' không phải là một lớp tĩnh. Bạn sẽ phải gọi hàm này trong ngữ cảnh của một phần tử giao diện người dùng có thuộc tính 'Dispatcher' hoặc bạn sẽ phải chuyển giao trong bộ điều phối làm đối số khác. –

2

Trong WPF và winforms bạn phải đưa nó vào MethodInvoker trước, nếu không bạn sẽ gặp lỗi Không thể chuyển đổi phương thức ẩn danh thành 'System.Delegate' vì nó không phải là loại đại biểu.

Dispatcher.BeginInvoke((MethodInvoker) delegate(List<JobViewModel> jobs) 
{ 
    inbox.DataContext = jobs; 
}); 

Để biết thêm thông: http://msdn.microsoft.com/en-us/library/system.windows.forms.methodinvoker.aspx