我在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.PercentageDwnd
和Overall.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)
谢谢所有的