Как использовать привязку данных для 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);