单独的视图不从后台工作者Mvvm更新

时间:2012-04-19 16:29:30

标签: c# mvvm

我在从另一个类中的后台工作程序更新单独打开的窗口的进度条时遇到问题。

程序执行如下:

  1. MainWindow加载
  2. 点击按钮做一些工作并打开一个弹出窗口 进度条(新打开的窗口)
  3. 后台工作人员确实有效 并向弹出进度条报告进度
  4. 弹出进度条 希望更新。
  5. 进度条值绑定到一个属性,该属性在逐步调试器中看起来可以由后台工作程序更新。这些更改不会反映在弹出进度条视图中。但是,绑定不会被破坏,因为如果我手动尝试设置进度条的属性值,它可以正常工作。

    此外,当我将进度条放在最初启动的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

2 个答案:

答案 0 :(得分:0)

您正在创建两个PopUpProgressBarViewModel。你有一个被创建为PopUpProgressBar.xaml内的资源,而另一个是在MainWindowViewModel中创建的(第18行)。

您的XAML绑定到PopUpProgressBar.xaml中创建的XAML,而您正在更新的XAML是在MainWindowViewModel中创建的XAML。

如果你可以减少它只有一个被创建,那应该可以解决你的问题。

答案 1 :(得分: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>