2012-04-19 2 views
3

별도로 열린 창의 진행률 막대를 다른 클래스의 배경 작업자로부터 업데이트하는 데 문제가 있습니다.별도의보기가 백그라운드 작업자에서 업데이트되지 않음 Mvvm

프로그램 실행은 다음과 같이 진행됩니다

  1. MainWindow를로드
  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는 말처럼

_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

빌어 먹을 하하에 그냥 한 줄을 PopUpProgressBar을 변경할 수 있습니다. 감사합니다 힙을 :) – Lukehb

0

두 개의 PopUpProgressBarViewModels를 만듭니다. PopUpProgressBar.xaml 내부에서 리소스로 생성되는 리소스가 있고 MainWindowViewModel (18 행)에서 다른 리소스가 만들어지고 있습니다.

XAML은 PopUpProgressBar.xaml 내에서 생성 된 것에 바인딩되지만, 업데이트중인 것은 MainWindowViewModel에서 생성 된 것입니다.

하나만 작성하여 문제점을 해결해야합니다. 이미 DataContext를 설정하고 있기 때문에

관련 문제