2010-03-22 9 views

Trả lời

27
int result = -1; 

// this is synchronous 
myCombo.Invoke(() => 
{ 
    result = myCombo.SelectedIndex; 
}); 

return result; 

Đây là, tất nhiên, loại clunky. Thiết kế tốt hơn sẽ thực hiện INotifyPropertyChanged trong máy ảo của bạn, tạo ra một thuộc tính SelectedIndex và liên kết thuộc tính SelectedIndex của hộp combo của bạn với nó. Các ràng buộc INPC không nhạy cảm với chủ đề (3.5 hoặc 4.0+, tôi không nhớ cái nào), vì vậy bạn có thể đọc và cập nhật các thuộc tính này từ các luồng khác nhau trong máy ảo của bạn mà không cần lo lắng.

0

Bạn không thể thực hiện việc này trực tiếp nhưng bạn có thể thực hiện việc này.

Dispatcher.Invoke() thực sự trả về giá trị trả về từ đại biểu bạn gọi, vì vậy hãy thay đổi đại biểu của bạn cho phù hợp.

Return Value

Loại: System.Object Sự trở lại giá trị từ các đại biểu được triệu gọi hoặc null nếu các đại biểu đã không trở lại giá trị .

Source

+0

Tôi đăng đoạn mã của tôi ở trên, làm cách nào tôi có thể sửa đổi điều này để cho phép đại biểu trả lại giá trị đã chọn cho combobox? thanks – toni

+0

Hành động không cho phép giá trị trả lại, trong trường hợp này, bạn sẽ phải sử dụng giải pháp như @Will – Chris

+0

Giải pháp sẽ không hoạt động trong Kiểm soát WPF của ComboBox. Tôi gặp lỗi. – toni

2

Đây là phương pháp của tôi để lấy giá trị được lựa chọn cho một combobox, làm thế nào tôi có thể nói đại biểu trở về giá trị?

private object getValueCB(System.Windows.Controls.ComboBox cb) 
    { 
     object obj; 


      if (!cb.Dispatcher.CheckAccess()) 
      { 
       obj = cb.Dispatcher.Invoke(
        System.Windows.Threading.DispatcherPriority.Normal, 
        new Action(
        delegate() 
        { 
         obj = cb.SelectedValue; 
        } 
       )); 

       return obj; 
      } 
      else 
      { 
       return obj = cb.SelectedValue; 
      } 

    } 
1

Tôi đã giải quyết vấn đề này. Giải pháp là tạo ra một đại biểu tùy chỉnh mà trả về kiểu mong muốn như thế này:

private object GetValueCB(System.Windows.Controls.ComboBox cb) 
    { 
     object obj = null; 


      if (!cb.Dispatcher.CheckAccess()) 
      { 
       obj = cb.Dispatcher.Invoke(
        System.Windows.Threading.DispatcherPriority.Normal, 
        (MyDelegate) 
        delegate() 
        { 
         return (obj = cb.SelectedValue); 
        } 
       ); 

       return obj; 
      } 
      else 
      { 
       return obj = cb.SelectedValue; 
      } 

    } 

    public delegate object MyDelegate(); 
24

Có một cách khác mà trả về giá trị từ Invoke():

object oIsLoaded = container.Dispatcher.Invoke(new Func<bool> (() => 
    { 
     return container.IsLoaded; 
    }) 
); 

Và bằng cách này, rất có thể là sự khởi đầu mã (đang làm việc với đại biểu) sẽ không sửa đổi tất cả oIsLoaded; Vì vậy, tôi muốn sử dụng một Func<> để trả về một giá trị từ loại chức năng đó.