将Shapes.Path项绑定到ItemsControl

我一直在试图弄清楚如何将ObservableCollection绑定到ItemsControl。 我有一个现有的项目,它严重依赖于后面的代码和canvas没有绑定,我试图更新以使用mvvm和prism。

ObservableCollection将填充许多Path项。 它们是由我使用的外部库生成的。 当我手动操作canvas本身时,库正常运行。

以下是ViewModel代码的片段:

  ObservableCollection _items; ObservableCollection Items { get { return _items; } set { _items = value; this.NotifyPropertyChanged("Items"); } } public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(string propertyName) { if (this.PropertyChanged != null) { this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } 

支持XAML

                  

我遇到的问题是Path永远不会画画。 关于我哪里出错以及从哪里开始调试过程的任何建议?

您的视图模型应包含Path的抽象表示,例如

 public class PathData { public Geometry Geometry { get; set; } public Brush Fill { get; set; } public Brush Stroke { get; set; } public double StrokeThickness { get; set; } // ... probably more Stroke-related properties } 

如果你现在有一个PathData对象的集合,如

 public ObservableCollection Paths { get; set; } 

你的ItemsControl可以有一个ItemsTemplate,如下所示:

             

您现在将添加PathData实例,如下所示:

 Paths.Add(new PathData { Geometry = new RectangleGeometry(new Rect(100, 100, 100, 100)), Fill = Brushes.AliceBlue, Stroke = Brushes.Red, StrokeThickness = 2 }); 

ObservableCollection是的,你可以在那里停下来。 那不是MVVM。 此外,您将项目模板定义为(空白,我猜你可以说)路径对象。 您不会将它绑定到您在可观察集合中抛出的路径的属性。

一个更好的实现是让ObservableCollection包含路径数据 ,AKA 实际定义路径形状的东西 ,然后将其绑定到您的路径。

             

如果您在运行时使用过Snoop检查UI,那么您已经看到有很多Path对象,但它们都有空数据。

另外,如果您使用血腥canvas作为Path形状,则需要在Paths上设置Canvas.LeftCanvas.Top附加属性。 一个真正的MVVM英雄将如此定义一个模型

 public PathData{ public double Left {get;set;} public double Top {get;set;} public string Data {get;set;} } 

然后在ViewModel中公开它们

 public ObservableCollection Items {get;private set;} 

然后将你的路径绑定到它们