数据绑定行,文本等到ItemsControl在画布上绘制类似cad的矢量

时间:2012-10-08 02:56:56

标签: wpf data-binding mvvm canvas itemscontrol

使用MVVM模式我想将行和文本写入Canvas,就像矢量CAD应用程序一样。在研究这个时,我得出结论,我需要使用ItemsControl,并将ItemsPanelTemplate声明为Canvas,如

<ItemsControl>
   <ItemsControl.ItemsPanel>
      <ItemsPanelTemplate>
         <Canvas/>
      </ItemsPanelTemplate>
   </ItemsControl.ItemsPanel>
</ItemsControl>

我还想知道我需要在ItemTemplate中添加某些东西(不确定是什么),就像这样。 。

  <ItemsControl.ItemTemplate>
     <DataTemplate>
         <!--  Don't know what goes here -->
     </DataTemplate>
  </ItemsControl.ItemTemplate>

我的问题

有人可以告诉我放入DataTemplate的内容,这样我就可以绑定到我的ViewModel并让ViewModel绘制文本(任何旋转,任何字体等),一条线,一条弧,一条贝塞尔,一条形状 - - - 我需要什么,取决于我绑定集合中的各种元素?

我的猜测是应该是一个System.Windows.FrameworkTemplate,但我仍在试图弄清楚如何使用它,而且它很慢。或者也许是ContentControl和Presenter?

参考

How to convert X/Y position to Canvas Left/Top properties when using ItemsControl

How can I position ViewModels in an ItemsControl

Is it possible to bind a Canvas's Children property in XAML? 注意:请参阅第二个答案。

1 个答案:

答案 0 :(得分:2)

有不同的方式。

您可以根据选择器切换DataTemplates。

public class ImgStringTemplateSelector : DataTemplateSelector
{
  public DataTemplate ImageTemplate { get; set; }
  public DataTemplate StringTemplate { get; set; }

  public override DataTemplate SelectTemplate(object item,
    DependencyObject container)
  {
    String path = (string)item;
    String ext = System.IO.Path.GetExtension(path);
    if (System.IO.File.Exists(path) && ext == ".jpg")
      return ImageTemplate;
    return StringTemplate;
  }

你可以通过ItemsPanel ItemTemplateSelector引用它。 Sch as ItemTemplateSelector =“{StaticResource ImgTemplateSelector}”。在那里,你选择要返回的模板。

您可以返回Line模板,Arc模板等。 这很容易。

另一个技巧是你可以拥有基类DrawingObject并从中派生。例如ArcObj:DrawingObject,

稍后你只需添加

<DataTemplate Datatype="{x:Type ArcObj"}>
<Arc Canvas.Left="{BInding X}", Canvas.Top="{Binding Y}" />
</DataTemplate>

等等。