【问题标题】:How Can I detect Changes on WCF Model?如何检测 WCF 模型的更改?
【发布时间】:2015-12-10 00:22:19
【问题描述】:

我有这个 ViewModel:

public class CombustiblesViewModel
{        
    public List<CombustiblesWCFModel> Combustibles{ get; set; }        

    public CombustiblesViewModel()
    {
        Combustibles = _svc.Combustibles_List(sTicket);                            
    }      
}  

Combustibles_List 从 WCF 服务返回一个列表。 我需要的是跟踪每个 CombustiblesWCFModel 对象的变化。所以我用这段代码扩展了我的模型:

public CombustiblesWCFModel()
    {
        this.PropertyChanged += ChangedRow;   
    }

    private void ChangedRow(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "HasChanges") return;
        CombustiblesWCFModel p = (CombustiblesWCFModel)sender;            
        // Should Rise HasChanges Property on model, but it doesn't work
        p.HasChanges = true;
    }

    private bool _haschanges;
    public bool HasChanges
    {
        get
        {
            return _haschanges;
        }
        set
        {
            _haschanges = value;
            this.RaisePropertyChanged("HasChanges");
        }
    }
}

我的问题是 HasChanges 总是错误的。我相信从 WCF 服务返回模型时会覆盖 PropertyChanged 事件。

问题

那么如何检测视图模型集合的每个对象上的模型更改?

【问题讨论】:

    标签: c# wcf propertychanged


    【解决方案1】:

    WCF 合约是序列化的对象,它们应该被视为不可变的。

    您想要做的是拥有一个本地缓存,您可以在其中将更改合并到您的有状态副本中。这可能就像将数据从合约映射到正确实现 INotifyPropertyChanged 的​​类一样简单。对于像AutoMapper 这样的简单映射工具,还有很长的路要走。

    对于更复杂的合并和差异,Compare .NET Objects 项目将提供细粒度信息。

    其他可能有用的工具是 Reactive Extensions 可观察集合,您可以在其中插入数据协定并订阅更改。

    另一种选择实际上是使用 WCF 迁移到发布者-订阅者模型。 IDesign 和 Juval Lowy 提供了一个现成的 Pub-Sub with WCF 实现。

    【讨论】:

      【解决方案2】:

      如果您的集合正在更改并且您需要获取更新的集合,您可以使用 ObservableCollection 代替自动实现 NotifyPropertyChanged 事件的 List。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-07
        • 1970-01-01
        • 1970-01-01
        • 2012-05-24
        • 2013-05-22
        相关资源
        最近更新 更多