ObservableCollection <T>替换以及如何使DataModel触发属性已更改

时间:2019-11-19 21:43:46

标签: c# wpf

因此,除了我的代码的一部分之外,一切都很好。我正在查看一个可观察的集合和一个列表,并在可观察的集合中设置一个元素,使其等于列表中的元素

someitemInOC = newListItem;

现在,触发了CollectionChanged事件,但是问题是我也希望也触发someitemInOC类型的所有属性...因为我有一个想要的SomeType_PropertyChanged函数打电话给............问题是我不知道该怎么办。显然,someitemInOC的类型具有setter中的OnNotifyPropertyChanged函数的所有属性...但是如何触发所有属性以调用它们的notify?这是一个数据模型,而不是一个视图模型,但是它确实继承了INotifyPropertyChanged

我的DataModel片段

public sealed class WModel : INotifyPropertyChanged
{
    private bool isD;
    public bool IsD
    {
        get { return isD; }
        set { isD = value; NotifyPropertyChanged(); }
    }

    private string wd;
    public string Wd
    {
        get { return wd; }
        set { wd = value; NotifyPropertyChanged(); }
    }
    public void UpdateAllParameters()
    {
        NotifyPropertyChanged(string.Empty);
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void NotifyPropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

在我的VM构造函数中,

WSource.CollectionChanged += WSource_CollectionChanged;

然后再向下

    private void WSource_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.Action == NotifyCollectionChangedAction.Remove)
        {
            foreach (WModel item in e.OldItems)
            {
                //Removed items
                item.PropertyChanged -= WPropertyChanged;
            }
        }
        else if (e.Action == NotifyCollectionChangedAction.Add)
        {
            foreach (WModel item in e.NewItems)
            {
                //Added items
                item.PropertyChanged += WPropertyChanged;
            }
        }
    }


    public void WPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        Wd = WSource.Where(x => x.IsD).Count();
    }

Wd是一个整数

我希望在替换可观察集合中的项目时调用WPropertyChanged函数...

我尝试做someitemInOC.UpdateAllParameters(),但没有任何反应

someitemInOC = newListItem;
someitemInOC.UpdateAllParameters();

NotifyPropertyChanged(string.Empty)被调用了,但这对任何东西都没有影响...我看不到setters被命中或Notify函数被调用...

使其正常工作...

必须将其添加到CollectionChanged函数 cry

        else if (e.Action == NotifyCollectionChangedAction.Replace)
        {
            foreach (WModel item in e.OldItems)
            {
                //Removed items
                item.PropertyChanged -= WPropertyChanged;
            }
            foreach (WModel item in e.NewItems)
            {
                //Added items
                item.PropertyChanged += WPropertyChanged;
            }
        }

我的生活...

0 个答案:

没有答案