2012-04-19 33 views
3

我有問題更新從另一個班級內的後臺工作人員單獨打開的窗口的進度欄。單獨的視圖不從後臺工作人員Mvvm

程序執行是這樣的:

  1. 主窗口負荷
  2. 點擊按鈕做了一些工作,並打開一個彈出 進度條(新打開的窗口)
  3. 背景工人做工作 和報告進度彈出進度條
  4. 彈出進度條 希望更新。

進度條值被綁定到一個屬性,在step-through調試器中,該屬性看起來被後臺工作人員更新好了。這些更改不會反映在彈出的進度欄視圖中。但是,綁定不會中斷,因爲如果我手動嘗試並設置進度欄的屬性值,它可以正常工作。此外,當我將進度條放入最初啓動的MainWindow視圖中時,它會更新正常。有什麼建議麼??

下面是一些代碼:

MainWindowViewModel

public class MainWindowViewModel: BaseViewModel 
{ 

    private void PerformSomeAction() 
    { 
     var popUpProgressBar = new PopUpProgressBarViewModel(); 
     popUpProgressBar.Show(popUpProgressBar); 

     var worker = new BackgroundWorker { WorkerReportsProgress = true }; 

     worker.ProgressChanged += delegate(object s, ProgressChangedEventArgs args) 
     { 
      if (args.ProgressPercentage != popUpProgressBar.Progresser) 
      { 
       Progresser = args.ProgressPercentage; 
       popUpProgressBar.Progresser = args.ProgressPercentage; 
      } 
     }; 

     worker.DoWork += delegate 
     { 


      for (int i = 0; i < 101; i++) 
      { 
       worker.ReportProgress(i); 
       System.Threading.Thread.Sleep(10); 
      } 


      MessageBox.Show("Done"); 
     }; 

      worker.RunWorkerAsync(); 

    } 


    private int _progresser; 
    public int Progresser 
    { 
     get { return _progresser; } 
     set 
     { 
      if (_progresser == value) return; 
      _progresser = value; 
      OnPropertyChanged("Progresser"); 
     } 
    } 

    private RelayCommand _startProcessing; //set private member 
    public ICommand StartProcessing //public field used by xaml binding 
    { 
     get 
     { 
      return _startProcessing = MakeCommandSafely(_startProcessing,() => PerformSomeAction()); 
     } 
    } 
} 

PopUpProgressBarViewModel

public class PopUpProgressBarViewModel : BaseViewModel 
{ 
    private PopUpProgressBar _popUpProgressBar; 

    public void Show(PopUpProgressBarViewModel context) 
    { 
     _popUpProgressBar = new PopUpProgressBar {DataContext = context}; 
     _popUpProgressBar.Show(); 
    } 

    private int _progresser; 
    public int Progresser 
    { 
     get { return _progresser; } 
     set 
     { 
      if (_progresser == value) return; 
      _progresser = value; 
      OnPropertyChanged("Progresser"); 
     } 
    } 
} 

對於完整的解決方案的文件(這樣你可以看到發生了什麼),see here

回答

0

正如@Doug說,既然你已經設置的DataContext:

_popUpProgressBar = new PopUpProgressBar {DataContext = context}; 

您可以更改PopUpProgressBar到

<Window x:Class="OpeningWindow_With_ProgressBar.View.PopUpProgressBar" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:ViewModel="clr-namespace:OpeningWindow_With_ProgressBar.ViewModel" Title="PopUpProgressBar" Height="150" Width="300"> 

<Grid> 

    <StackPanel> 
     <Label FontWeight="Bold">Loading Something</Label> 
     <ProgressBar Minimum="0" Maximum="100" Margin="0,10,0,0" Height="25px" Width="250px" Value="{Binding Path=Progresser, Mode=OneWay}"></ProgressBar> 
     <TextBlock Margin="10,10,0,0" Text="Details of loading..."></TextBlock> 
    </StackPanel> 

</Grid> 

+0

哈哈該死的,剛纔那一條線。謝謝堆:) – Lukehb 2012-04-20 00:51:10

0

您正在創建兩個PopUpProgressBarViewModels。你有一個被創建爲PopUpProgressBar.xaml內部的資源,另一個正在MainWindowViewModel(第18行)中創建。

您的XAML綁定到PopUpProgressBar.xaml中創建的那個,而您正在更新的是在MainWindowViewModel中創建的那個。

如果你可以削減,所以只有一個被創建,這應該可以解決你的問題。