我试图将我的XAML中的GeometryModel3D绑定到C#中的ViewModel中的属性属性。我正在使用Caliburn.Micro来建立我的MVVM。下面是我在View XAML中尝试绑定的简化代码片段:
<Viewport3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<Model3DGroup>
<GeometryModel3D x:Name = "CubeVisual_Cube">
</Model3DGroup>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D>
在我的C#ViewModel中:
private CubeModel _cubeVisual = new CubeModel();
public CubeModel CubeVisual
{
get { return _cubeVisual; }
set
{
_cubeVisual = value;
NotifyOfPropertyChange(() => CubeVisual);
}
}
CubeVisual有一个构造函数,可以完全建立GeomretyModel3D的几何和材质。最后是我创建GeometryModel3D属性的CubeModel类:
public class CubeModel
{
private GeometryModel3D _cube;
public GeometryModel3D Cube
{
get { return _cube; }
set { _cube = value; }
}
}
当我执行此代码时,似乎立方体没有正确地绑定到我的视图中的Geometry3D。我的CubeVisual属性中没有命中断点。没有生成错误来帮助我解决这个问题。关于我做错了什么的任何想法?谢谢。
Viewport3D不支持数据绑定,因此即使使用常规INPC,也不会让它工作,更不用说Caliburn Micro了。如果你问我,这是非常烦人的,因为没有充分的理由为什么它应该与2D有任何不同,即你应该能够使用Viewport3D作为ItemsControl面板,然后使用数据模板填充基于图形对象的场景在场景视图模型的集合上(如果它不能像这样完全实现那么它至少应该是类似的东西)。唉,这些都没有被整合到3d类中,所以我们留下了这种半支持的大杂烩,其中单个3d对象属性是具有完全绑定支持等的适当依赖属性,但实际场景管理本身不是。
所以基本上如果你想要这个,你必须自己做。创建具有“ItemsSource”依赖项属性的用户控件,然后设置集合更改通知,以便在此列表中的项目更改时相应地更新场景。如何将视图模型映射到实际的3D场景对象取决于您,一种可能的解决方案是使用视图模型作为您希望它表示的3d对象的关键(值得注意的是,这实际上是DataTemplates在2D情况.... <DataTemplate DataType="{x:Type viewModelType}>
只是<DataTemplate x:Key="{x:Type viewModelType}>
的语法糖)。