Tôi đang có một thời gian tìm ra cách xử lý một Chủ đề từ một lớp bên ngoài ViewModel của tôi.Làm thế nào để xử lý chủ đề C# WPF trong mô hình xem MVVM
Chủ đề bắt nguồn từ lớp Track
. Đây là ResponseEventHandler
mã trong Track
:
public delegate void ResponseEventHandler(AbstractResponse response);
public event ResponseEventHandler OnResponseEvent;
Khi một phương pháp "lệnh" được xử lý từ bên trong đối tượng Track
của tôi, đoạn code sau chạy OnResponseEvent
, mà gửi một thông điệp trong một chủ đề trở lại ViewModel của tôi:
if (OnResponseEvent != null)
{
OnResponseEvent(GetResponseFromCurrentBuffer());
}
GetResponseFromCurrentBuffer()
chỉ trả về loại thông báo là loại được xác định trước trong số Track
.
constructor MainWindowViewModel
tôi tạo ra một event handler cho OnResponseEvent
từ Track
:
public MainWindowViewModel()
{
Track _Track = new Track();
_Track.OnResponseEvent +=
new Track.ResponseEventHandler(UpdateTrackResponseWindow);
}
Vì vậy, ý tưởng là mỗi khi tôi có một tin nhắn mới đến từ các OnResponseEvent
Chủ đề, tôi chạy phương pháp UpdateTrackResponseWindow()
. Phương pháp này sẽ nối thêm một chuỗi thông điệp mới cho một tài sản được gọi TrackResponseMessage
danh sách ObservableCollection<string>
:
private void UpdateTrackResponseWindow(AbstractResponse message)
{
TrackResponseMessage.Add(FormatMessageResponseToString(message));
}
Phương pháp FormatMessageResponseToString()
chỉ đơn thuần so sánh nhắn với tất cả các loại tin nhắn được xác định trước trong Track
, và làm một số định dạng chuỗi tiện lợi.
Vấn đề chính là: Giao diện người dùng biến mất khi TrackResponseMessage.Add()
chạy. Thực thi vẫn chạy ở chế độ nền, và cách duy nhất để kết thúc nhiệm vụ là để tắt Visual Studio 2010.
TrackResponseMessage
là một tài sản công trong ViewModel của tôi:
public ObservableCollection<String> TrackResponseMessage
{
get { return _trackResponseMessage; }
set
{
_trackResponseMessage = value;
RaisePropertyChanged("TrackResponseMessage");
}
}
Có một nhu cầu cho tôi để soái các Thread
đến từ các đối tượng Track
để ViewModel của tôi? Bất kỳ mã ví dụ nào cũng sẽ được đánh giá cao!
Yeeehaw !! Nó hoạt động rất tốt! Reed, tôi nợ bạn một chiếc bánh rán! Bạn đã tiết kiệm cho tôi số giờ đọc tài liệu luồng .net. TaskScheduler giúp bạn dễ dàng đọc các luồng đang phát sinh từ các đối tượng lớp khác trong viewmodel của tôi. – EnLaCucha
@EnLaCucha: FYI - Điều này chỉ hoạt động cho các chủ đề có cài đặt SynchronizationContext. Đó là sự thật cho chủ đề chính của WPF, chủ đề chính của WinForms, và các cuộc gọi dịch vụ WCF, mặc dù. –
Với .net 4.5, bây giờ bạn có thể chỉnh sửa bộ sưu tập từ một chuỗi khác bằng BindingOperations.EnableCollectionSynchronization https://msdn.microsoft.com/en-us/library/hh140164(v=vs.110).aspx – Kelly