簡體   English   中英

單獨的視圖不從后台工作者Mvvm更新

[英]Separate View not updating from background worker Mvvm

我在從另一個類中的后台工作者更新單獨打開的窗口的進度條時遇到問題。

程序執行如下:

  1. MainWindow加載
  2. 單擊按鈕進行一些工作並打開彈出進度條(新打開的窗口)
  3. 后台工作人員確實工作並向彈出進度條報告進度
  4. 彈出進度條有望更新。

進度條Value綁定到一個屬性,該屬性在逐步調試器中看起來可以被后台工作者更新。 這些更改不會反映在彈出進度條視圖中。 但是,綁定不會被破壞,因為如果我手動嘗試並設置進度條的屬性值,它可以正常工作。

此外,當我將進度條放在最初啟動的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");
        }
    }
}

對於完整的解決方案文件(所以你可以看到發生了什么), 請看這里

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

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

如果你可以減少它只有一個被創建,那應該可以解決你的問題。

正如@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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM