标签MVVM中显示的WPF百分比状态



我在WCF的GridView中显示下载百分比时遇到了一些问题。我使用了MVVM模式。

下面是我的后台worker在application start:

public partial class MainWindow : Window
   {
       public MainWindow()
       {
           Overall.EverythingOk = "Nothing";
           InitializeComponent();
           //IRepo repo = new Repo();
           ViewModel.MainWindowsViewModel viewModel = new ViewModel.MainWindowsViewModel();
           this.DataContext = viewModel;     
           BackGroundThread bgT = new BackGroundThread();
           bgT.bgWrk.RunWorkerAsync();
       }}

这是BackGroundTHread类中的DoWork函数

 public void bw_DoWork(object sender, DoWorkEventArgs e)
   {
       if (!Overall.stopStatus)
       {
           for (int i=0; i < 10000; i++)
           {
               Overall.PercentageDwnd = i;
               Overall.caseRefId = "999999";
               if (i == 9998)
               {
                   i = 1;
               }
           }
       }
   }

Overall.PercentageDwndOverall.caseRefId是静态变量(你可以在应用程序的任何地方调用),并且总是更新,直到后台工作完成。我有另一个ViewModel叫TestViewModel,在这里。

public class TestViewModel:BindableBase
    {        
        private String _UpdatePer=Overall.PercentageDwnd.ToString();
        public String UpdatePercentage
        {
            get { return _UpdatePer; }
            set { SetProperty(ref _UpdatePer, value); }
        }
        private ObservableCollection _ViewAKA = new ObservableCollection();
        private tblTransaction model;
        public TestViewModel(tblTransaction model)
        {
            // TODO: Complete member initialization
        }
        public ObservableCollection ViewAKA
        {
            get { return _ViewAKA; }
            set { SetProperty(ref _ViewAKA, value); }
        }
    }

我绑定了TestView.xaml文件

    <Window x:Class="EmployeeManager.View.TestView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="TestView" Height="359.774" Width="542.481">
    <Grid Margin="0,0,2,0">
        <Label Content="{Binding UpdatePercentage,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Background="Red" Foreground="White" Margin="130,86,0,0" VerticalAlignment="Top" Width="132" Height="39">            
        </Label> 
    </Grid>
</Window>

没有实时更新标签,即使我绑定UpdatePercentage到它。如何实时更新标签?

问题是您正在更新静态属性,这些属性没有绑定到任何东西。您需要更新并引发绑定到标签控件的属性的属性更改通知,即UpdatePercentage

你能传递TestViewModel实例到RunWorkerAsync调用吗?

bgT.bgWrk.RunWorkerAsync(testViewModel);

然后在DoWork事件处理器中访问:

public void bw_DoWork(object sender, DoWorkEventArgs e)
{
   if (!Overall.stopStatus)
   {
       var viewModel = e.Argument as TestViewModel;
       for (int i=0; i < 10000; i++)
       {
           Overall.PercentageDwnd = i;
           viewModel.UpdatePercentage = i;
           Overall.caseRefId = "999999";
           if (i == 9998)
           {
               i = 1;
           }
        }
    }
}

答案链接:

https://social.msdn.microsoft.com/forums/vstudio/en us/02a7b9d1 - 1 - c26 - 4 -爱意a137 - 5455 - fee175b9/wpf -比例-状态-显示-标签mvvm?forum=wpf

我需要触发时的总体。

编辑

In Overall Class:

public class Overall
{
    private static int _percentage;
    public static int PercentageDwnd
    {
        get { return _percentage; }
        set
        {
            _percentage = value;
            //raise event:
            if (PercentageDwndChanged != null)
                PercentageDwndChanged(null, EventArgs.Empty);
        }
    }
    public static string caseRefId { get; set; }
    public static bool stopStatus { get; set; }
    public static event EventHandler PercentageDwndChanged;
}
在TestViewModel:

public class TestViewModel : BindableBase
{
    private String _UpdatePer = Overall.PercentageDwnd.ToString();
    public String UpdatePercentage
    {
        get { return _UpdatePer; }
        set { SetProperty(ref _UpdatePer, value); }
    }
    public TestViewModel(tblTransaction model)
    {
        Overall.PercentageDwndChanged += Overall_PercentageDwndChanged;
        // TODO: Complete member initialization
    }
    private void Overall_PercentageDwndChanged(object sender, EventArgs e)
    {
        this.UpdatePercentage = Overall.PercentageDwnd.ToString();
    }
}

因为你已经将视图中的TextBlock绑定到UpdatePercentage源属性,你需要设置这个属性,并在你想要更新视图中的Label时引发PropertyChanged事件。这意味着您需要知道何时总体。PercentageDwnd属性更改。

信用马格纳斯(MM8)(MCC,合伙人,MVP)

谢谢所有的

最新更新