Window不会对凸起的属性更改事件做出反应

时间:2017-07-10 12:43:13

标签: c# wpf mvvm-light

我的View模型存在问题......行为......很奇怪。我有一些属性,我称之为RaisePropertyChanged(()=> TotalHours),但在视图方面没有任何反应。这是我的模型的一个纲要。我运行MVVM Light。

我的模型在我的viewmodel中被称为AxData,它包含两个ObservableCollections,它们包含一些实现ObservableObject的对象。这些在视图中反应良好。我的模型中还有一个IsDirty和TotalHours属性。这些根本没有反应。 Axdata正在从MVVM Light实现Observableobject。

为了能够使用我的IsDirty标志,我订阅了CollectionChanged的两个集合。我还通过执行以下操作在这些集合中的对象上订阅了PropertyChanged事件:

private void AttachListners()
{
    WorkUnits.CollectionChanged += OnCollectionChanged;
    Projects.CollectionChanged += OnCollectionChanged;
}

private void OnCollectionChanged(object o, NotifyCollectionChangedEventArgs notifyCollectionChangedEventArgs)
{
    if (notifyCollectionChangedEventArgs.NewItems != null)
    {
        foreach (ObservableObject item in notifyCollectionChangedEventArgs.NewItems)
        {
            item.PropertyChanged += OnSubItemPropertyChanged;
        }
    }

    if (notifyCollectionChangedEventArgs.OldItems != null)
    {
        foreach (ObservableObject item in notifyCollectionChangedEventArgs?.OldItems)
        {
            item.PropertyChanged -= OnSubItemPropertyChanged;
        }
    }

    IsDirty = true;
    RaisePropertyChanged(() => TotalHours);
}

private void OnSubItemPropertyChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs)
{
    IsDirty = true;
    RaisePropertyChanged(() => TotalHours);
}

当我调试代码时,我可以完全到达OnCollectionChanged和OnSubItemPropertyChanged中的RaisePropertyChanged(()=> TotalHours)。所以我确实在TotalHours上举旗。 IsDirty独自提升:

public bool IsDirty
{
    set
    {
        _isDirty = value;
        RaisePropertyChanged(() => IsDirty);
    }
    get { return _isDirty; }
}

实施总时数

public double TotalHours
{
    get { return WorkUnits.Sum(unit => unit.Hours); }
}

TotalHours刚刚绑定到文本块:

<TextBlock Text="{Binding AxData.TotalHours}"/>

我的视图模型使用IsDirty,其中订阅了我的模型属性更改事件:

private void AxDataOnPropertyChanged(object o, PropertyChangedEventArgs propertyChangedEventArgs)
{
    if (propertyChangedEventArgs.PropertyName == "IsDirty")
    {
        PopulateTitle();
    }
}

我应该注意,我的ObservableCollections中的所有对象大多是通过Datagrids编辑的。所有更改都正确执行,所有数据都已正确更改,但我不知道这些信息是否至关重要。

那么为什么我的视图没有对变化做出反应?希望你能提供帮助,因为我已经坚持了大约一个月了。我错过了什么。

1 个答案:

答案 0 :(得分:0)

据我了解,您正在努力在ObservableCollection中应用项目更改。这是WPF中的常见问题,我建议您使用ObservableCollectionEx库。它有助于在PropertyChanges内冒出ObservableCollection个项目。

https://www.nuget.org/packages/ObservableCollectionEx/

在nuget中找到了几个ObservableCollectionEx个库,它们的实现方式几乎相同。