2012-04-19 11 views
3

別のクラスのバックグラウンドワーカーから別に開いたウィンドウの進行状況バーを更新する際に問題が発生しています。個別のビューがバックグラウンドワーカーから更新されないMvvm

プログラムの実行はこのように書き:

  1. メイン・ウィンドウ負荷
  2. 背景労働者が仕事 とレポートを行いますいくつかの作業を行うと、ポップアップ プログレスバー(別ウインドウ)
  3. を開くためにクリックボタンポップアッププログレスバーに進む
  4. ポップアッププログレスバー うまくいきます。

値は、ステップスルーデバッガーのバックグラウンドワーカーによって正しく更新されているように見えるプロパティにバインドされています。これらの変更はポップアッププログレスバービューには反映されません。しかし、私が手作業でプログレスバーのプロパティ値を設定しようとすると、正常に動作するので、バインディングは壊れません。

また、最初に起動した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}; 

あなたは

<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

いまいましいハハ、ちょうどその1行にPopUpProgressBarを変更することができます。ありがとうヒープ:) – Lukehb

0

2つのPopUpProgressBarViewModelを作成しています。 PopUpProgressBar.xaml内にリソースとして作成されているものがあり、もう1つはMainWindowViewModel(18行目)で作成されています。

XAMLはPopUpProgressBar.xaml内に作成されたものにバインドされますが、更新するものはMainWindowViewModelで作成されたものにバインドされます。

1つしか作成されないようにすると問題が解決するはずです。

関連する問題