【问题标题】:Window does not react to raised property changed events窗口不响应引发的属性更改事件
【发布时间】:2017-07-10 12:43:13
【问题描述】:

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

在我的视图模型中称为 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 编辑的。所有更改都正确执行,所有数据都正确更改,但我不知道这些信息是否至关重要。

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

【问题讨论】:

  • 什么是 AxData?您是否为此对象引发 PropertyChanged 事件?您的 TotalHours 属性是如何实现的?
  • “包含一些对象的 ObservableCollections”
  • 您可能还想将UpdateSourceTrigger=PropertyChanged 添加到您的绑定中
  • 我编辑了我的帖子以回应你们所有的 cmets。很抱歉我错过了几个关键点。 Axdata 是我的模型的名称,它从 MVVM light 实现 ObservableObject。我在帖子中添加了总小时数。我的 ObservableCollections 中的所有对象也都实现了 ObservableObject。我尝试将 UpdateSourceTrigger=PropertyChanged 用于绑定,但没有效果。

标签: c# wpf mvvm-light


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-15
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 2011-01-29
    相关资源
    最近更新 更多