2010-10-27 46 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

相关问题