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

У меня есть несколько элементов в моей модели представления, которые я собираюсь визуализировать в 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 Ответ

7 голосов
/ 11 октября 2011

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

Чтобы создать привязку для свойства зависимости для чего-то, что не является элементом инфраструктуры, вы используете статический метод 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...