【发布时间】: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