2014-03-04 49 views
0

我已經定義點的列表如下:數據更改時自動調用函數?

private List<Point> points = new List<Point>(); 

,我想提請通過下面的函數在給定畫布上:

private void draw_all_points_on_canvas(Canvas canvas_name, List<Point> points); 

我的問題是:我怎麼能實現當數據points更改爲時,將自動調用此繪圖函數的目標?


PS:這個問題似乎很相似,使數據成爲ObservableCollectionObservableCollection<Point> points)其中,但是,也不會直接在這裏工作,我不能用canvas_name.ItemsSource = points;,因爲我也需要定義如何這些點在繪圖函數中繪製在畫布上。

回答

2

是的,你需要一個ObservableCollection並掛接它的CollectionChanged事件,這是wpf在數據發生變化時得到通知的方式。

private ObservableCollection<Point> points = new ObservableCollection<Point>(); 

points.CollectionChanged += points_CollectionChanged;//Subscribe event 

void collection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    //Handle it below respectively 
    switch (e.Action) 
    { 
     case NotifyCollectionChangedAction.Add: 
      break; 
     case NotifyCollectionChangedAction.Remove: 
      break; 
     case NotifyCollectionChangedAction.Replace: 
      break; 
     case NotifyCollectionChangedAction.Move: 
      break; 
     case NotifyCollectionChangedAction.Reset: 
      break; 
    }    
} 
0

ObservableCollection<T>將在這裏工作,因爲它定義CollectionChanged事件......

訂閱該事件 - 當數據發生了變化,將被自動升起(我假設Point是不可變的)。

+1

[Point is Mutable](http://msdn.microsoft.com/en-us/library/system.windows.point%28v=vs.110%29.aspx) –

+1

由於某種原因,我記得不然... 無論如何,你不能通知一個點是改變。你可以做什麼 - 用你自己的類型包裝點,而這種類型會有事件(你可以實現'INotifyPropertyChanged') –

1

,您仍然可以使用ObservableCollection<Point>

_points = new ObservableCollection<Point>(); 
_points.CollectionChanged += (o, e) => 
    draw_all_points_on_canvas(canvas_name, _points); 

作爲一個側面說明,它可以使用數據綁定來畫點到Canvas

<ItemsControl> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <Canvas /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Ellipse Fill="Black" 
         Width="1" 
         Height="1" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
    <ItemsControl.ItemContainerStyle> 
     <Style> 
      <Setter Property="Canvas.Left" 
        Value="{Binding X}" /> 
      <Setter Property="Canvas.Top" 
        Value="{Binding Y}" /> 
     </Style> 
    </ItemsControl.ItemContainerStyle> 
</ItemsControl> 

然後使用ItemsSource = points就萬事大吉了!請注意,這種方式可能不如使用DrawingContext進行繪圖的效果好,如果您有點數點,您應該更喜歡後者。否則,此方法具有很多其他的優點:

  • 您呈現XAML數據
  • 您可以使用數據綁定和觸發器
  • 每一項都是一個不折不扣的控制,這意味着它可以有工具提示,迴應鼠標等
相關問題