如何从c#中的属性列表中提取属性更改值

时间:2016-07-07 10:04:05

标签: wpf mvvm event-handling c#-3.0 propertychanged

我正在使用MVVM模式和WPF应用程序。 我从通过USB通信与我的应用程序(桌面)通信的设备获得的数据。

这是我的MVVM结构:

在模型中:我从设备获取数据(在WinCE平台上运行) 在这里,我创建了一个事件public event EventHandler<PropertyEventArgs> propertyChanged;

protected void RaisepropertyChangedEvent(PropertyEventArgs e)
{
    if (this.propertyChanged != null)
    {
        this.propertyChanged(this, e);
    }
}

public class PropertyEventArgs : EventArgs
{
    public int lf { get; set; } 
    public int dateformat { get; set; }
    public string pid { get; set; }
    public int language { get; set; }
    public int Line { get; set; }
    public string Label { get; set;}
    public int uValue { get; set; }
    public int lvalue { get; set; }
    public int lMethod { get; set; }
}

在视图模型中我正在举办此活动:

当一些数据来临时,我正在提出这个事件:

this.RaisepropertyChangedEvent(this.pargs);

在用户界面中:我已将此活动订阅到更新用户界面

this.eObj.propertyChanged += new EventHandler<PropertyEventArgs>(this.EpropertyChanged); 

private void EpropertyChanged(object sender, PropertyEventArgs e)
{
    this.OnPropertyChanged(new PropertyChangedEventArgs("linePercentage"));
    this.OnPropertyChanged(new PropertyChangedEventArgs("Label"));
    this.OnPropertyChanged(new PropertyChangedEventArgs("UL"));
    this.OnPropertyChanged(new PropertyChangedEventArgs("LMethod"));
}

eobj是我宣布Eventargs的地方。

我面临的问题是,当财产价值发生变化时,所有财产都会被调用。

因为有时某个参数设置了错误的值。

请帮我解决这个问题。

1 个答案:

答案 0 :(得分:2)

如果我理解你想要的东西,你可以缓存信息,知道改变了什么:

private PropertyEventArgs _oldState = null;

private void EpropertyChanged(object sender, PropertyEventArgs e)
{
    if(_oldState == null || e.SomeProperty.CompareTo(linePercentage) != 0) 
        this.OnPropertyChanged(new PropertyChangedEventArgs("linePercentage"));
    if(_oldState == null || e.Label.CompareTo(Label) != 0) 
        this.OnPropertyChanged(new PropertyChangedEventArgs("Label"));
    if(_oldState == null || e.SomeProperty.CompareTo(UL) != 0) 
        this.OnPropertyChanged(new PropertyChangedEventArgs("UL"));
    if(_oldState == null || e.lMethod.CompareTo(LMethod) != 0) 
        this.OnPropertyChanged(new PropertyChangedEventArgs("LMethod"));
    ...
    _oldState = e;
}