使用delegate从其他类更新wpf标签信息

本文关键字:wpf 标签 信息 更新 delegate 其他 使用 | 更新日期: 2023-09-27 18:20:01

我有Wpf窗口和相应的ViewModelMainWindow上有一个与属性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是静态方法。

使用delegate从其他类更新wpf标签信息

这里有一种快速而肮脏的方法:

(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:_SelectedCountryCurrentActionTaken

您可以通过定义一个ISupportCurrentActionTaken接口来进一步将MyOtherClassMainViewModel解耦,但如果它们位于同一个项目中,这显然是过分了。