c# - 如何对 Visual3D 或 UIElement3D 等 3D 元素使用数据绑定(bind)

标签 c# wpf data-binding 3d

我的 View 模型中有一堆项目,我将使用 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 中省略了灯光和相机,但当然我的代码中也有)

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

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

请注意,绑定(bind)转换在 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 时,如何从代码创建上述绑定(bind)? ?

最佳答案

我找到了我自己的问题的答案,所以我将其张贴在这里是为了以后找到此页面的其他人。

要在非框架元素的依赖属性上创建绑定(bind),您可以使用静态 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);

关于c# - 如何对 Visual3D 或 UIElement3D 等 3D 元素使用数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7725313/

相关文章:

wpf - 代码和 xaml 中的 ListBox.ItemsSource 绑定(bind)

c# - 如何让 MahApps CleanWindow 工作?

wpf - WPF 中图像填充按钮上的空间

c# - WPF - 恢复 ComboBox ItemSsource 中的上一个 SelectedItem 已更改

c# - 自托管 Wcf 服务于 wsdl 但在调用时为 404

c# - 等待所有线程完成的有用模式是什么?

c# - XML 序列化数据返回的最佳数据类型

c# - Web API 请求的滑动 session

sql - 为什么 Linq To Sql 数据绑定(bind)到 gridview 比传递 SQL 慢得多?

c# - 在 PropertyChange 的 ItemsControl 中为派生的 ObservableCollection<T> 重新排序呈现的项目