2016-11-22 77 views
0

我的ViewModel中有一個屬性,其值在BackgroundWorker的DoWork方法中更改。當我啓動應用程序並單擊啓動BackgroundWorker的按鈕時,我會看到此屬性的值如何更改。但是,當我打開一個新窗口時,該屬性保留其默認值,即使BackgroundWorker仍在運行,該屬性也不會更新。更新WPF中另一個窗口的屬性值

她是我的ViewModel代碼:

private string currentData; 

... 

public ViewModel() 
    { 
     ... 

     // Property initialised with a default value 
     currentData = "BackgroundWorker is not running"; 

     ... 
    } 

public string CurrentData 
    { 
     get { return this.currentData; } 
     private set 
     { 
      if (this.currentData != value) 
      { 
       this.currentData = value; 
       this.RaisePropertyChanged("CurrentData"); 
      } 
     } 
    } 

private void DoWork(object sender, DoWorkEventArgs e) 
    { 
     isUpdating = true; 

     ... 

     this.CurrentData = "BackgroundWorker is running..."; 

     for (...) 
     { 
      ... 

      if(...) 
      { 
       this.CurrentData = "value1"; 
      } 

      else 
      { 
       this.CurrentData = "value2"; 

       ... 
      }  
     } 
    } 

RaisePropertyChanged方法:

<TextBlock Margin="10" MinWidth="250" VerticalAlignment="Center" Text="{Binding CurrentData}" FontSize="12" Foreground="White" HorizontalAlignment="Left" /> 

BackgroundWorker的:兩個窗口(主窗口和newtWindow)

private void RaisePropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

XAML代碼:

private readonly BackgroundWorker worker; 

... 

public ImageViewModel() 
    { 
     currentData = "BackgroundWorker is not running"; 

     this.worker = new BackgroundWorker(); 
     this.worker.DoWork += this.DoWork; 
     this.worker.ProgressChanged += this.ProgressChanged; 
     this.worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_Completeted); 
     this.worker.WorkerReportsProgress = true; 
    } 

你能告訴我做錯了什麼,我該如何解決它?

+0

那裏有很多橢圓(...)你看不到類定義, t看到'RaisePropertyChanged'方法,你沒有看到任何事件,請提供實際編譯的代碼,否則幾乎不可能發生什麼問題 – Sefe

+0

橢圓(...)只代表很多被執行的操作。所以,因爲代碼很長,所以是 – Guilian

+0

你有Whatevs類的實例A.你正在改變實例A的屬性。如果你想要兩個窗口顯示這個實例A的改變版本,那麼這兩個窗口必須有實例A的引用。你如何在兩個窗口之間共享實例取決於你的設計,誰構造窗戶,以及它們是如何構建的。 – Will

回答

0

你將不得不創建一個私有字符串引用了你的財產, 的其屬性可以設置的值,它會被保存在棧上, 像這樣(這是多麼WPF得到文本框信息中文本屬性)

 private string _text; //string that is used as a reference which you can plug your new new window 

    public string Text 
    { 
     get 
     { 
      return this._text; 
     } 
     set 
     { 
      this._text = value; 
      if (null != PropertyChanged) 
      { 
       this.PropertyChanged(this, new PropertyChangedEventArgs ("Text")); 
      } 
     } 
    } 
+0

我應該如何使用新窗口的文本,因爲我使用MainWindow的CurrentData? – Guilian

0

我會避免從後臺線程更新綁定到UI的屬性。我不確定這是否能解決您的問題,但我會嘗試使用BackgroundWorker的ReportProgress方法來通知您的ViewModel有關CurrentData的更改。然後在OnProgressChanged事件處理程序中,您可以將CurrentData設置爲一個新的String。

public void ReportProgress(int percentProgress, object userState) 

您可以將您的字符串放入「userState」對象。

編輯

是這樣的:

public ViewModel() 
    { 
     ... 

     backgroundWorker.ReportsProgress = true; 
     backgroundWorker.ProgressChanged += OnProgressChanged; 

     ... 
    } 

private void DoWork(object sender, DoWorkEventArgs e) 
{ 
    isUpdating = true; 

    ... 

    ReportProgress(0,"BackgroundWorker is running..."); 

    for (...) 
    { 
     ... 

     if(...) 
     { 
      ReportProgress(0,"value1"); 
     } 

     else 
     { 
      ReportProgress(0,"value2"); 

      ... 
     }  
    } 
} 

private void OnProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    this.CurrentData = (string)e.UserState; 
} 
+0

我試過了,但是porperty沒有在新窗口上更新。它保留了默認值:( – Guilian

+0

)如何設置新窗口的DataContext? – mbger

+0

' ' – Guilian

0
所以從你已經表示,到目前爲止我的理解如下

確定:

從你原來的問題:

但是,當我打開一個新窗口時,此屬性保留其默認值,即使BackgroundWorker仍在運行,它也不會更新。

從你到我以前的答覆有關設置窗口的DataContext的評論:

<Window.DataContext> <local:ViewModel /> </Window.DataContext> 

當您創建一個新的窗口,你還可以創建你的視圖模型的新實例。這個新實例也有自己的BackgroundWorker。當你說 」...即使BackgroundWorker仍在運行「,那麼這隻適用於您的第一個窗口,因爲您的新窗口中的Backgroundworker必須先啓動。

如果您希望使用相同的DataContext(以及相同的BackgroundWorker)這兩個窗口,你需要將你的新窗口的DataContext設置爲ViewModel的已經存在的實例

相關問題