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

时间:2015-09-19 08:50:35

标签: c# wpf xaml mvvm

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

这是应用程序启动时的后台工作者:

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

以下是DoWork

中的BackGroundTHread函数
 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是静态变量(您可以从应用程序的任何位置调用)并始终更新,直到后台工作程序完成。我得到了另一个名为TestViewModel的ViewModel,现在是。

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绑定到它,Label也没有实时更新。如何更新实时标签?

2 个答案:

答案 0 :(得分:2)

问题是您正在更新未绑定到任何内容的静态属性。您需要更新并引发绑定到标签控件的属性的属性更改通知,即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;
           }
        }
    }
}

答案 1 :(得分:1)

这是答案链接:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/02a7b9d1-1c26-4aee-a137-5455fee175b9/wpf-percentage-status-shown-in-label-mvvm?forum=wpf

我需要在Overall.PercentageDwnd属性更改时触发。

被修改

总体课程:

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事件。这意味着您需要知道Overall.PercentageDwnd属性何时更改。

归功于 马格努斯(MM8) (MCC,合作伙伴,MVP)

全部谢谢