【发布时间】:2018-07-09 11:34:23
【问题描述】:
我有许多进度条,每个进度条都绑定到它们自己的 int 属性,用于更新它们的进度。在幕后,我有一个多次运行的方法,它执行我的处理(循环数据),我用它来更新更新进度条的属性。
我遇到的问题是您无法将属性传递给该方法。我可以创建该方法的多个副本,每个副本都引用每个进度条的特定属性,但这需要大量重复的代码。有人会建议我如何将属性传递给方法?
基本上这是我想要做的,但显然通过 ref 传递属性是行不通的。
Method(fileList, errorList, _ViewModel.ProgressBarProp1);
Method(fileList, errorList, _ViewModel.ProgressBarProp2);
...
private static void Method(IEnumerable<string> fileList, List<Tuple<string,
string>> errorList, ref int PropertyInt)
{
foreach (var file in fileList)
{
if (!File.Exists(file))
{
errorList.Add(new Tuple<string, string>(file,
" does not exist in the folder"));
}
PropertyInt++;
}
}
我见过this question,但这涉及字符串,我无法为整数场景实施任何解决方案。
更新
在下面实施 Mike 的解决方案是允许从方法内访问该属性,但是我在同时运行它的方式上有一些奇怪的行为。
我正在实现这样的代码,两个方法同时运行但递增相同的属性值(即,两者都关联到同一个进度条)。
var taskList = new List<Task>
{
Task.Run(() =>
{
Method1(fileList, errorList, p => _ViewModel.ProgressBarProp1 = p);
}),
Task.Run(() =>
{
Method2(fileList, errorList, p => _ViewModel.ProgressBarProp1 = p);
})
};
await Task.WhenAll(taskList.ToArray());
但是,似乎只有一个正在更新。是什么原因?有解决办法吗?
【问题讨论】:
-
@Clemens 不,我想在方法运行时动态更新属性,而不是在方法完成时更新。
-
您可以将属性和属性名称作为字符串传递。然后在您更新属性(PropertyInt)之后,您可以使用您传递的名称调用 PropertyChanged。但是如果你想在 UI 中看到更新,你的方法应该在单独的线程中运行。