c# - 当我引发事件时,它始终为null

标签 c# wpf multithreading mvvm

在我的MainViewModel中,我订阅了Event:

var uc = new MyUserControl();
uc.ViewModel.ValueTypeChangedEvent += OnValueTypeChanged;
Control05 = uc;

StartMeasuring2();

我的BackgroundWorker是:
private myUserControl Control05 { get; set; }

private void StartMeasuring2()
{
    _backgroundWorkerP2.RunWorkerCompleted += backgroundWorkerCompleted;
    _backgroundWorkerP2.DoWork += BackgroundWorkerDoWork;

    if (_backgroundWorkerP2.IsBusy)
        _backgroundWorkerP2.CancelAsync();
     else
     {    
         _backgroundWorkerP2.RunWorkerAsync();
     }
}

private void BackgroundWorkerDoWork(object sender, DoWorkEventArgs eventArgs)
{
    Thread.Sleep(3000);

    while (!StopMeasuringP2)
    {
        const int measurementStatus = 0;
        var random = new Random();
        double measurementValue = random.Next(1, 9);
        var dateTime = DateTime.Now;
        Control05.ViewModel.UserControl1.ViewModel.LastDayMesswerte(dateTime,measurementValue, measurementStatus);
        Thread.Sleep(7000);
     }
}

编辑:

这是我在用户控件ViewModel中的LastDayMesswerte方法:
public virtual void LastDayMesswerte(DateTime time, double measurementValue, int measurementStatus)
{
     if(measurementValue>=0 && measurementValue<3) 
          ValueType = "Alarm";

     if(measurementValue>=3 && measurementValue<6)
          ValueType = "Warning";

     else
     {
         ValueType = "Normal";
     }
}

我的ValueType是属性:
public virtual string ValueType
{
    get { return _valueType; }

    set
    {
        if (_valueType == value) return;
        _valueType = value;
        OnValueTypeChangedEvent(ControlId, MasterId);
    }
}
OnValueTypeChangedEvent:
protected virtual void OnValueTypeChangedEvent(int controlId, int masterId)
{
    ValueTypeChangedEventHandler handler;

    lock (_valueTypeChangedEventLock)
    {
        handler = _valueTypeChangedEvent;
    }

    if (handler != null) handler(controlId, masterId);
 }

因此,在我用自己的LastDayMesswerte调用BackgroundWorker之前,_valueTypeChangedEvent不为NULL。我在方法LastDayMesswerte的第一个if语句上设置了一个断点,并且_valueTypeChangedEvent已经为NULL。为什么会这样呢?

最佳答案

如果我没记错的话(您的代码很不常见-我不会从ViewModel创建一个UserControl,该ViewModel在其ViewModel中还包含另一个UserControl本身也具有ViewModel),那么问题就在于

Control05.ViewModel.UserControl1.ViewModel.LastDayMesswerte(...)

您在LastDayMesswerte中调用Control05.ViewModel.UserControl1.ViewModel,但从未在其中设置ValueTypeChangedEvent。相反,您将其设置为Control05.ViewModel

关于c# - 当我引发事件时,它始终为null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17065379/

相关文章:

c# - 如何从UI将项目添加到ComboBox?

c# - WPF CheckBox 多重绑定(bind)

c# - 在 c# 中以异步方式启动多个 "TASK"s

c# - 调用控件与调用表单

c# - .NET/C# - 反射帮助 - 程序集中的类

c# - 从字符串中检索货币符号

c# - WPF中TabControl的TabChanged事件

c# - 多线程:我什么时候使用 Join?

c# - 尝试转换 IEnumerable 时出现异常?

c# - .NET winforms 应用程序在不使用 ClickOnce 的情况下更新自身的最佳方式是什么?