Я хочу прокомментировать, но еще не могу. Да, у меня очень похожая проблема. В моем случае это моя модель просмотра, которая обновляет свойство DownloadStatus, а затем, когда загрузка завершена, я делаю еще немного работы и продолжаю обновлять это свойство.
Вид перестает обновляться после того, как код ViewModel попадает в метод OpenReadCompleted. Я тщательно прошел через код. Свойство PropertyChanged, и представление даже возвращается и извлекает новое значение свойства, но никогда не показывает изменения.
Я был уверен, что это была ошибка, но затем я создал совершенно новый проект, чтобы воспроизвести проблему, и она отлично работает!
Вот фрагмент моего невоспроизводимого кода. Текстовый блок пользовательского интерфейса, привязанный к «DownloadStatus», счастливо обновляется должным образом на всем протяжении. Но та же парадигма не работает в моем основном проекте. Бешенство!
public void BeginDownload(bool doWorkAfterDownload)
{
DownloadStatus = "Starting ...";
_doExtraWork = doWorkAfterDownload;
var webClient = new WebClient();
string auth = "Basic " + Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes("test:password"));
webClient.Headers["Authorization"] = auth;
webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(webClient_OpenReadCompleted);
webClient.OpenReadAsync(new Uri("http://www.ben.geek.nz/samsung1.jpg"));
}
void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
if (e.Error != null)
{
DownloadStatus = e.Error.Message;
return;
}
DownloadStatus = "Completed. Idle.";
if(_doExtraWork)
{
Thread t = new Thread(DoWork);
t.Start(e.Result);
}
}
void DoWork(object param)
{
InvokeDownloadCompleted(new EventArgs());
// just do some updating
for (int i = 1; i <= 10; i++)
{
DownloadStatus = string.Format("Doing work {0}/10", i);
Thread.Sleep(500);
}
DownloadStatus = "Completed extra work. Idle.";
InvokeExtraWorkCompleted(new EventArgs());
}
Я предполагаю, что там есть опечатка, ваш настоящий код: client.DownloadStringCompleted + = (s, e) => {textBlock1.Text = e.Result; }; правый? – TheTodd
yup fixed. Благодарю. чрезмерно усердный backspacing :) –
John - вне интереса переместите свой код в обработчик события «Loaded». Просто хочу посмотреть, не является ли это чем-то уникальным для конструктора. –