Как использовать привязку данных для 3D-элементов, таких как Visual3D или UIElement3D

у меня есть куча элементов в моей viewmodel, которые я собираюсь визуализировать в 3D с помощью Viewport3D. Соответствующие части пользовательского интерфейса определяются следующим образом:

<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?

1 ответов


Я нашел ответ на свой вопрос, поэтому я размещаю его здесь в интересах других, которые найдут эту страницу позже.

чтобы создать привязку к свойству зависимостей на чем-то, что не является элементом framework, вы используете static 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);