2017-07-10 82 views
-1

我的View Model存在一個問題,它的行爲很奇怪。我有一些屬性,我打電話RaisePropertyChanged(()=> TotalHours),但在視圖方面沒有任何反應。這是我的模型的簡介。我運行MVVM Light。窗口不會對提出的屬性更改的事件做出反應

我在我的viewmodel中被稱爲AxData的模型由兩個ObservableCollections組成,這兩個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

什麼是AxData?你提出這個對象的PropertyChanged事件嗎?你的TotalHours屬性如何實現? – mm8

+0

「ObservableCollections持有一些對象」< - 您的對象是否實現INotifyPropertyChanged? –

+0

您可能還想添加'UpdateSourceTrigger = PropertyChanged'到您的綁定 –

回答

0

據我所知,你正在努力在ObservableCollection中應用項目更改。這是WPF中的常見問題,我建議您使用ObservableCollectionEx庫。它有助於在ObservableCollection內冒出PropertyChanges的物品。

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

幾個ObservableCollectionEx庫中的NuGet發現他們幾乎執行相同的方式。

相關問題