2010-10-27 48 views
1

我在XAML中有一個圖表控件,以及綁定到控件的數據點。 問題是,當我的ModelView更改點的集合圖表控件沒有得到任何通知。我已經嘗試過dp,使用ObservableCollection和INotifyPropertyChanged沒有任何運氣。我知道改變一個字段/屬性和使集合操作(​​如添加/刪除/替換等)更改傳播到圖表控件是有區別的。但我沒有得到它的工作。更改事件僅在實例/恢復集合時觸發。MVVM中的ObservableCollection和INotifyPropertyChanged問題

是否有任何鏈接到正在工作的MVVM與集合?

值得了解。

 

public class ObservableCollection : Collection, INotifyCollectionChanged, INotifyPropertyChanged 

 

     public static DependencyProperty WorkModelsProperty = DependencyProperty.Register("WorkModels", typeof(ObservableCollection), typeof(Chart), 
      new PropertyMetadata(new ObservableCollection { }, new PropertyChangedCallback(
      (sender, args) => 
      { 
       Debugger.Break(); //trigged only when collection got new instance 
      }))); 

     public ObservableCollection WorkModels 
     { 
      get { return (ObservableCollection)GetValue(WorkModelsProperty); } 
      set { SetValue(WorkModelsProperty, value); } 
     } 
 

的結合是正確和測試。代碼在Window.Resources中。

 
ObjectDataProvider ObjectType="{x:Type vm:ListWorkViewModel}" x:Key="ListWorkViewModel" 

控件的綁定。

 

WorkModels="{Binding Source={StaticResource ListWorkViewModel}, Path=WorkModels}" 
 

在ViewModel中,我使用下面的代碼來引發更改。 (當使用INotifyPropertyChanged的)

 
WorkModels.Add(workModel); 
this.RaisePropertyChanged("WorkModels"); 

protected void RaisePropertyChanged(string propertyName) 
{ 
    VerifyPropertyName(propertyName); 
    if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
} 
 

當我使用的ObservableCollection我只新的數據點添加到集合。

 
WorkModels.Add(workModel); 
 

Question on MVVM pattern on WPF?

+1

您是否在使用Visifire圖表? – TerrorAustralis 2010-10-27 05:49:36

+0

您的WorkModel是否使用DependencyProperties實現INotifyPropertyChanged或DependencyObject? – Euphoric 2010-10-27 06:05:06

+0

@Euphoric,它不應該需要。我可以看到這個不工作的唯一原因是在Chart控件中。經歷了一個斷點,看看它在財產變化時的作用 – TerrorAustralis 2010-10-27 06:11:42

回答

0

謝謝你的答案。我在這裏找到了解決問題的辦法。 http://msdn.microsoft.com/en-us/library/aa970563.aspx

對於一般的依賴屬性,您按照實現模式是定義一個CLR屬性包裝,其中該屬性由DependencyProperty標識符,而不是一個場或其他結構的支持。當您實現集合類型屬性時,您遵循相同的模式。但是,只要集合中包含的類型本身是DependencyObject或Freezable派生類,集合類型屬性就會爲模式 帶來一些複雜性。

0

需要更多的代碼。你如何綁定? ObservableCollection是什麼類型?你確定你在課堂上非常喜歡ObservableColletion的價值嗎?

編輯:也改變你的問題的標題。這有點模棱兩可,並不是真正的問題。

+0

圖表是一個WPF控件。 – 2010-10-27 05:50:59

+0

ObservableCollection的類型是ObservableCollection 。 WorkModel是模型。 – 2010-10-27 06:00:33

0

你有沒有嘗試過這樣的事情...

private IEnumerable<DataPoint> _DataPoints; 
public IEnumerable<DataPoint> DataPoints 
{ 
    get 
    { 
     return _DataPoints; 
    } 

    set 
    { 
     if (_DataPoints != value) 
     { 
      _DataPoints = value; 
      this.OnPropertyChanged("DataPoints"); 
     } 
    } 
} 

然後,每當您修改數據點集合中的任何一點,你提出一個屬性更改事件對整個數據點設置

/// <summary> 
    /// Raised when a property on this object has a new value. 
    /// </summary> 
    public event PropertyChangedEventHandler PropertyChanged; 

    /// <summary> 
    /// Raises this object's PropertyChanged event. 
    /// </summary> 
    /// <param name="propertyName">The property that has a new value.</param> 
    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     //this.VerifyPropertyName(propertyName); 

     PropertyChangedEventHandler handler = this.PropertyChanged; 
     if (handler != null) 
     { 
      var e = new PropertyChangedEventArgs(propertyName); 
      handler(this, e); 
     } 
    } 

編輯:
嘗試將資源類型從StaticResource更改爲DynamicResource ...
http://msdn.microsoft.com/en-us/library/ms750613.aspx#staticdynamic
資源可能正在加載頁面/窗口,並且從未更新過。這可以解釋缺乏事件通信的

+0

收集操作和更改收集數據有所不同。將數據從集合中添加/刪除後,OnPropertyChanged(「DataPoints」)將不起作用。 – 2010-10-27 06:07:58

+0

這是真的,但是當你添加/刪除時,就像你在你的例子中完成一樣,提出相同的事件 – TerrorAustralis 2010-10-27 06:12:23

+0

當我使用ObservableCollection時,我什麼也沒有引發。請檢查更新的問題。 – 2010-10-27 06:25:02

0

你有這樣的:

WorkModels="{Binding Source={StaticResource ListWorkViewModel}, Path=WorkModels}" 

你爲什麼靜態資源綁定?如何定義資源?它是否在XAML本身?你確定你確實正在更新控件綁定的模型的同一個實例嗎?

+0

請檢查數據源的更新問題。 使用傳播到Chart控件的簡單屬性(無集合類型)檢查數據源實例。 – 2010-10-27 06:23:06

相關問題