数据发生变化时自动调用函数?

时间:2014-03-04 11:58:41

标签: c# wpf binding

我有一个如下定义的点列表:

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;,我还需要定义如何在绘图函数中在画布上绘制这些点。

3 个答案:

答案 0 :(得分: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;
    }            
}

答案 1 :(得分: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并vo!注意这种方式可能不如使用DrawingContext绘图那么好,如果你有一个很多点,你应该更喜欢后者。否则这种方法有很多其他优点:

  • 您在XAML中呈现数据
  • 您可以使用数据绑定和触发器
  • 每个项目都是完全成熟的控件,这意味着它可以有工具提示,响应鼠标等。

答案 2 :(得分:0)

ObservableCollection<T>可以在此处使用,因为它定义了CollectionChanged事件......

订阅该事件 - 当数据发生变化时会自动引发(我假设Point是不可变的)。