我如何使用数据绑定3D元素,如Visual3D或UIElement3D

本文关键字:Visual3D UIElement3D 3D 何使用 数据绑定 元素 | 更新日期: 2023-09-27 18:11:09

我在我的视图模型中有一堆项目,我将使用Viewport3D在3D中渲染。UI的相关部分定义如下:

<Viewport3D x:Name="viewport">
    <Viewport3D.Children>
        <!-- This is my custom control, deriving from UIElement3D -->
        <local:myCollectionVisualizer Items="{Binding MyItems}" />
    </Viewport3D.Children>
</Viewport3D>

(我从上面的xaml中省略了灯光和相机,但当然这也在我的代码中)

现在,我希望我的自定义控件将所有项目(来自我定义的Items依赖属性)呈现为位于其绑定对象指定位置的单个UIElement3D元素。

到目前为止,我的方法是重写GetVisual3DChild和相关的方法/属性来为我的项目设置父子关系。我面临的问题是如何将子对象的转换转换数据绑定到我的绑定对象中定义的值-因为UIElement3D不是从FrameworkElement派生的,所以没有SetBinding方法,因此没有明显的方法从代码中指定绑定。

注意,绑定转换在XAML中工作得很好:

<Viewport3D x:Name="viewport">
    <Viewport3D.Children>
        <perspective:Spherical3D>
            <perspective:Spherical3D.Transform>
                <Transform3DGroup>
                    <!-- This works fine! -->
                    <TranslateTransform3D OffsetX="{Binding X}" 
                                          OffsetY="{Binding Y}" 
                                          OffsetZ="{Binding Z}" />
                </Transform3DGroup>
            </perspective:Spherical3D.Transform>
        </perspective:Spherical3D>
    </Viewport3D.Children>
</Viewport3D>

当我不能访问FrameworkElement.SetBinding时,我如何从代码中创建上述绑定?

我如何使用数据绑定3D元素,如Visual3D或UIElement3D

我找到了我自己问题的答案,所以我把它贴在这里,以便其他人以后找到这个页面。

要在非框架元素的依赖属性上创建绑定,可以使用静态的BindingOperations。SetBinding方法。在我的例子中,最终结果是这样的:

var visual = new Spherical3D();
var tx = new TranslateTransform3D();
BindingOperations.SetBinding(tx, TranslateTransform3D.OffsetXProperty, 
                             new Binding("X") { Source = myDataObject });
BindingOperations.SetBinding(tx, TranslateTransform3D.OffsetYProperty, 
                             new Binding("Y") { Source = myDataObject });
BindingOperations.SetBinding(tx, TranslateTransform3D.OffsetZProperty, 
                             new Binding("Z") { Source = myDataObject });
visual.Transform = tx;
Children.Add(visual);
AddVisual3DChild(visual);