Tôi đã tìm kiếm trên diễn đàn nhưng không có câu hỏi nào phù hợp với vấn đề của tôi ...Tại sao BackgroundWorker_RunWorkerCompleted không cập nhật GUI?
Tôi sử dụng một BackgroundWorker để xử lý thao tác tốn thời gian. Sau khi hoàn thành thao tác này, nút sẽ được đặt thành bật để người dùng có thể thực hiện một thao tác khác.
Tôi đang sử dụng WPF và tôi đang theo mẫu MVVM, vì vậy tôi không có quyền truy cập trực tiếp vào nút này. Tôi phải gọi một phương thức trong trình xử lý sự kiện BackgroundWorker_RunWorkerCompleted đặt thuộc tính, biểu diễn các nút được bật trạng thái, thành true.
Tất cả đều hoạt động tốt ngoại trừ một điều: Nút chỉ được vẽ lại sau tôi, ví dụ: nhấp vào cửa sổ (hoặc phóng to cửa sổ, ...). Thats rất khó chịu và đưa tôi cả ngày để thoát khỏi hành vi này nhưng tôi không thể tìm thấy một giải pháp ...
Các xử lý sự kiện BackgroundWorker_RunWorkerCompleted trông như thế này:
void fileLoadBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
SetButtonToEnabled(); }
Có ai bất kỳ ý tưởng như thế nào để khắc phục vấn đề này?
Edit:
Các nút được ràng buộc với một lệnh:
<Button Name="btnLoadTargetFile" Command="{Binding Path=LoadTargetCommand}" .../>
Lệnh này là một RelayCommand như Smith nói trong blog của mình (http://msdn.microsoft.com/en-us/magazine/dd419663.aspx) và trông như thế này:
public RelayCommand LoadTargetCommand
{
get
{
if (loadTargetCommand == null)
{
loadTargetCommand = new RelayCommand(param => this.OnRequestLoadFile(BusinessLogic.CustomTypes.TreeType.Target), param => this.CanLoadTarget);
}
return loadTargetCommand;
}
set { loadTargetCommand = value; }
}
this.CanLoadTarget được đặt thành true bởi SetButtonToEnabled(); phương pháp
Chỉnh sửa 2:
đoạn mã sau 'làm việc':
fileLoadBackgroundWorker.RunWorkerAsync(argumentList);
while(fileLoadBackgroundWorker.IsBusy)
System.Windows.Forms.Application.DoEvents();
SetButtonToEnabled();
nhưng đó là một số loại mã thực sự nguy hiểm và xấu xí ...
Khi bạn đặt thuộc tính thành true, bạn tăng sự kiện 'PropertyChanged' (tức là. Viewmodel của bạn có triển khai' INotifyPropertyChanged' đúng không?) –
Nếu tôi gọi phương thức đó sau khi fileLoadBackgroundWorker.RunWorkerAsync() mọi thứ hoạt động tốt, vì vậy tôi không nghĩ đó là vấn đề ?! – lakai
Chỉ vì tò mò, bạn có đang sử dụng bất kỳ sửa đổi WMI nào cho hình dạng hoặc đường viền của biểu mẫu (màu đường viền, v.v ...) không? –