如何将Canvas绑定到Silverlight中的项集合

时间:2010-04-05 13:17:19

标签: silverlight data-binding canvas

背景

我有一组想要在画布上绘制的对象。这些对象中的每一个都有一个DateTime属性,该属性确定该对象在画布上沿x轴的位置。每个对象还有一些其他属性,用于确定需要在画布上绘制的图像。我想要实现的最重要的功能是,随着时间的推移,第二个表示对象的这些图像将沿着x轴移动。换句话说,画布的右侧垂直边界将始终表示当前时间(例如DateTime.Now),并且集合中的对象需要更新它们相对于该边界在画布上的位置。我对Silverlight很新,因此我有很多问题,包括以下内容。另外,我还要求遵循MVVM框架。

问题

我应该在XAML中使用什么来实现上述目标?我想过使用带有Canvas的ItemsControl作为Panel,但我不知道该怎么做,甚至不知道它是否是最佳方式。任何实际的XAML代码都会很棒。

如何将对象集合绑定到画布?如果是这样,我如何随着时间的推移沿着x轴移动它们?也就是说,我希望画布随时更新:

  • 有添加的对象 采集;或
  • 从集合中删除的对象; 或
  • 现有对象改变(例如一些 财产改变,因此需要 更改显示的图像 画布)在集合中;或
  • 即使没有变化 如上所述,这些集合 对象需要每次移动 第二

很抱歉,如果我使用错误的条款,因为我还是Silverlight的新手。

感谢。

2 个答案:

答案 0 :(得分:3)

我知道这个问题有点陈旧,但你可以使用渲染变换 - 我正在做类似的事情;

<ItemsControl ItemsSource="{Binding Notes}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>

    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Border Width="{Binding W}" Height="{Binding H}" BorderBrush="Navy" BorderThickness="5" CornerRadius="10">
                <TextBlock Text="{Binding Text}"/>
                <Border.RenderTransform>
                    <TransformGroup>
                        <... elided ...>
                        <TranslateTransform X="{Binding X}" Y="{Binding Y}"/>
                    </TransformGroup>
                </Border.RenderTransform>
            </Border>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

答案 1 :(得分:2)

如果你真的想使用MVVM和数据绑定,那么将ItemsPanel定义为Canvas的ItemsControl可能正常工作。将ItemsControl.ItemsSource绑定到VM中的ObservableCollection。在ItemsControl的ItemTemplate中,将UI项目元素的Canvas.X和Canvas.Y绑定到您的数据项,使用中间的IValueConverter进行DateTime到X coord的映射等等。

这样的事情:

<ItemsControl ItemsSource="{Binding Path=MyItemsInVM, Mode=OneWay}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas></Canvas>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Border Width="50" Height="50" Canvas.Left="{Binding Path=MyDateTimeProperty, Converter={StaticResource DateTimeToLeftOffsetConverter}}" Canvas.Top="100" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

另一种方法是使用Model-View-Presenter模式。 MVVM不是镇上唯一的节目。当您需要进行大量UI操作或使用VSM时,Presenter可能更适合(尽管行为也可以发挥重要作用)。

您可以在演示者中设置以刷新间隔运行的计时器,并在Presenter中处理计时器事件以迭代集合并将对象映射到(X,Y)位置,直接更新UI元素。