使用delegate从其他类更新wpf标签信息
本文关键字:wpf 标签 信息 更新 delegate 其他 使用 | 更新日期: 2023-09-27 18:20:01
我有Wpf窗口和相应的ViewModel
。MainWindow
上有一个与属性CurrentActionTaken
绑定的标签
private string _CurrentActionTaken;
public string CurrentActionTaken
{
get{
return _CurrentActionTaken;
}
set{
_CurrentActionTaken = value;
OnPropertyChanged("CurrentActionTaken");
}
}
我有一个BackgroundWorker
,它在同一视图模型中调用私有方法WorkerDoWork
_Worker = new BackgroundWorker();
...
_Worker.DoWork += (obj, e) => WorkerDoWork(_selectedEnumAction, _SelectedCountry);
_Worker.RunWorkerAsync();
在WorkerDoWork
中,我想调用其他类,它将承担繁重的工作,并且我想在我的MainWindow
标签(绑定到CurrentActionTaken
属性)上显示当前正在处理的项目
private void WorkerDoWork(Enums.ProviderAction action, CountryCombo selCountry)
{
_CurrentActionTaken = "entered WorkerDoWork method";
OnPropertyChanged("CurrentActionTaken");
new MyOtherClass(_selectedEnumAction, _SelectedCountry);
...
}
在这里,我想使用将在OtherClass
数据迭代方法上调用的方法:
public static void DataProcessUpdateHandler(string item)
{
MessageBox.Show(item);
}
并最终从OtherClass
:中某个地方的迭代调用
foreach (var item in items)
{
...
MainViewModel.DataProcessUpdateHandler(item.NameOfProcessedItem);
}
在DataProcessUpdateHandler
中显示MessageBox
内的项目时一切正常
MessageBox.Show(item);
我的问题是如何改变这一点并使用
_CurrentActionTaken = item;
OnPropertyChanged("CurrentActionTaken");
目前还不可能,因为DataProcessUpdateHandler
是静态方法。
这里有一种快速而肮脏的方法:
(Application.Current.MainWindow.DataContext as MainViewModel).CurrentActionTaken = "Executing evil plan to take control of the world."
当然,如果您的MainViewModel
可以通过主窗口内的属性访问,您应该进行调整:
Application.Current.MainWindow.Model.CurrentActionTaken = "Executing evil plan to take control of the world."
"正确"的方法是绕过你的视图模型(或任何其他中间对象),但如果你想保持简单,并且可以使用上面的方法,那么IMHO对制作更复杂的东西毫无用处。
编辑:根据你对清洁的要求,你可以绕过VM:
private void WorkerDoWork(Enums.ProviderAction action, CountryCombo selCountry)
{
_CurrentActionTaken = "entered WorkerDoWork method";
OnPropertyChanged("CurrentActionTaken");
new MyOtherClass(_selectedEnumAction, this);
...
}
并且MyOtherClass
实例将能够访问整个VM:_SelectedCountry
和CurrentActionTaken
。
您可以通过定义一个ISupportCurrentActionTaken
接口来进一步将MyOtherClass
与MainViewModel
解耦,但如果它们位于同一个项目中,这显然是过分了。