我的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编辑的。所有更改都正确执行,所有数据都已正确更改,但我不知道这些信息是否至关重要。
那么为什么我的视图没有对变化做出反应?希望你能提供帮助,因为我已经坚持了大约一个月了。我错过了什么。
答案 0 :(得分:0)
据我了解,您正在努力在ObservableCollection中应用项目更改。这是WPF中的常见问题,我建议您使用ObservableCollectionEx
库。它有助于在PropertyChanges
内冒出ObservableCollection
个项目。
https://www.nuget.org/packages/ObservableCollectionEx/
在nuget中找到了几个ObservableCollectionEx
个库,它们的实现方式几乎相同。