3

我在从另一个班级的后台工作人员更新单独打开的窗口的进度条时遇到问题。

程序执行如下:

  1. 主窗口加载
  2. 点击按钮做一些工作并打开一个弹出进度条(新打开的窗口)
  3. 后台工作人员确实工作并向弹出进度条报告进度
  4. 弹出进度条希望更新。

进度条值绑定到一个属性,在逐步调试器中,后台工作人员似乎可以更新该属性。这些更改不会反映在弹出进度条视图上。但是,绑定没有损坏,因为如果我手动尝试设置进度条的属性值,它可以正常工作。

此外,当我将进度条放在最初启动的 MainWindow 视图中时,它会更新得很好。有什么建议么??

这是一些代码:

主窗口视图模型

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");
        }
    }
}

有关完整的解决方案文件(这样您就可以看到发生了什么),请参见此处

4

2 回答 2

0

您正在创建两个 PopUpProgressBarViewModel。您已经在 PopUpProgressBar.xaml 中创建了一个资源,而另一个正在 MainWindowViewModel 中创建(第 18 行)。

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

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

于 2012-04-19T16:47:19.373 回答
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>

于 2012-04-19T17:02:44.000 回答