C# MVVM视图绑定不会更新,即使在从事件处理程序进行更新时触发了属性更改

C# MVVM视图绑定不会更新,即使在从事件处理程序进行更新时触发了属性更改,c#,mvvm,C#,Mvvm,我面临以下问题: 我使用一个类来封装串行端口操作,如下所示: public class SNScanner : IDisposable { public string COMPort { get; set; } public int Baudrate { get; set; } SerialPort sp; string Rsv; public SNScanner(string cOMPort, int bauderate) {

我面临以下问题: 我使用一个类来封装串行端口操作,如下所示:

 public class SNScanner : IDisposable
{
    public string COMPort { get; set; }
    public int Baudrate { get; set; }
    SerialPort sp;
    string Rsv;
    public SNScanner(string cOMPort, int bauderate)
    {
        COMPort = cOMPort;
        Baudrate = bauderate;
        sp = new SerialPort()
        {
            PortName = COMPort,
            BaudRate = Baudrate,
            DataBits = 8,
            StopBits = StopBits.One,
            Parity = Parity.None
        };
        sp.DataReceived += Sp_DataReceived;
        if (!sp.IsOpen)
        {
            sp.Open();
        }
    }

    private void Sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        Thread.Sleep(100);
        Rsv = string.Empty;
        Rsv = sp.ReadExisting();
        if (!string.IsNullOrEmpty(Rsv) && Rsv.Length == 17 )
        {
            OnSerialNumberDetected(new SerialNumberDetectedEventArgs {
                SerialNumber = Rsv.Substring(1,15) });
        }
    }



    #region Serial number detected event
    public event EventHandler SerialNumberDetected;

    protected virtual void OnSerialNumberDetected(EventArgs e) => SerialNumberDetected?.Invoke(this, e);

    public void Dispose()
    {
        sp.Close();
        try
        {
            sp.Dispose();
        }
        catch (Exception)
        {

        }
    }


    #endregion
}
public class SerialNumberDetectedEventArgs : EventArgs
{
    public string SerialNumber { get; set; }
}
        myscanner = new SNScanner("COM3", 9600);
        SerialNumber = "Empty";
        myscanner .SerialNumberDetected += myscanner_SerialNumberDetected;

    }

    private void myscanner_SerialNumberDetected(object sender, EventArgs e)
    {
        SerialNumber = ((SerialNumberDetectedEventArgs)e).SerialNumber;
    }


    private string _sn;

    public string SerialNumber
    {
        get { return _sn; }
        set { _sn = value; NotifyPropertyChanged(nameof(_sn)); }
    }
当它检测到符合我的条件的正确序列号时,将触发SerialNumber Detected事件。 在视图模型中,我将此事件上标如下:

 public class SNScanner : IDisposable
{
    public string COMPort { get; set; }
    public int Baudrate { get; set; }
    SerialPort sp;
    string Rsv;
    public SNScanner(string cOMPort, int bauderate)
    {
        COMPort = cOMPort;
        Baudrate = bauderate;
        sp = new SerialPort()
        {
            PortName = COMPort,
            BaudRate = Baudrate,
            DataBits = 8,
            StopBits = StopBits.One,
            Parity = Parity.None
        };
        sp.DataReceived += Sp_DataReceived;
        if (!sp.IsOpen)
        {
            sp.Open();
        }
    }

    private void Sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        Thread.Sleep(100);
        Rsv = string.Empty;
        Rsv = sp.ReadExisting();
        if (!string.IsNullOrEmpty(Rsv) && Rsv.Length == 17 )
        {
            OnSerialNumberDetected(new SerialNumberDetectedEventArgs {
                SerialNumber = Rsv.Substring(1,15) });
        }
    }



    #region Serial number detected event
    public event EventHandler SerialNumberDetected;

    protected virtual void OnSerialNumberDetected(EventArgs e) => SerialNumberDetected?.Invoke(this, e);

    public void Dispose()
    {
        sp.Close();
        try
        {
            sp.Dispose();
        }
        catch (Exception)
        {

        }
    }


    #endregion
}
public class SerialNumberDetectedEventArgs : EventArgs
{
    public string SerialNumber { get; set; }
}
        myscanner = new SNScanner("COM3", 9600);
        SerialNumber = "Empty";
        myscanner .SerialNumberDetected += myscanner_SerialNumberDetected;

    }

    private void myscanner_SerialNumberDetected(object sender, EventArgs e)
    {
        SerialNumber = ((SerialNumberDetectedEventArgs)e).SerialNumber;
    }


    private string _sn;

    public string SerialNumber
    {
        get { return _sn; }
        set { _sn = value; NotifyPropertyChanged(nameof(_sn)); }
    }
我的观点如下

<Window.DataContext>
    <local:mvm/>
</Window.DataContext>    
<Label FontFamily="Console"
                    FontSize="20"
                    Content="{Binding SerialNumber}"
                    Margin="5"
                    VerticalAlignment="Center"
                    Width="400"/>

调试期间,视图模型可以从事件接收序列号,但视图不会更新。

您正在通知错误的属性名称:

    public string SerialNumber
    {
        get { return _sn; }
        set { _sn = value; NotifyPropertyChanged(nameof(_sn)); }
    }

不是NotifyPropertyChangednameof,而是应为NotifyPropertyChangednameof序列号

ViewModel的基类是什么?它是否实现INotifyPropertyChanged?事件是在UI线程还是后台线程上触发的?是,我的基本模型实现了INotifyPropertyChanged。默认情况下,串行端口在单独的线程中工作,但在我的视图模型中,我不直接侦听SP事件。谢谢。但是为什么,我曾经更新私有属性content={Binding SerialNumber}将您的视图绑定到SerialNumber属性。因此,您应该通知视图SerialNumber属性已更改。