2011-10-11 8 views
5

Mam kilka elementów w moim viewmodel, które będę renderować w 3D przy użyciu Viewport3D. Odpowiednie fragmenty interfejsu jest zdefiniowany jako takie:Jak używać wiązania danych dla elementów 3D, takich jak Visual3D lub UIElement3D

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

(pominąłem światła i kamerę z XAML powyżej, ale oczywiście, że również tam w moim kodu)

Teraz chciałbym mój własny kontrolę zrenderować wszystkie elementy (z zdefiniowanej przez mnie właściwości zależności Items) jako pojedyncze elementy umieszczone w lokalizacji określonej przez ich powiązany obiekt.

Moje dotychczasowe podejście polega na zastąpieniu GetVisual3DChild i powiązanych metod/właściwości, aby ustawić relację rodzic-dziecko dla moich produktów. Problem, przed którym stoję, polega na tym, że dane wiążą transformację translacji podrzędnej z wartościami zdefiniowanymi w moim powiązanym obiekcie. Ponieważ UIElement3D nie wywodzi się z FrameworkElement, nie ma metody SetBinding, a zatem nie ma wyraźnego sposobu na określenie powiązania z kodu.

Należy pamiętać, że wiązanie transformacji działa dobrze w 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> 

Jak mogę utworzyć wiązanie z powyższym kodem, kiedy nie ma dostępu do FrameworkElement.SetBinding?

Odpowiedz

6

Znalazłem odpowiedź na moje własne pytanie, dlatego zamieszczam ją tutaj, aby inni mogli ją znaleźć później.

Aby utworzyć powiązanie dla właściwości dependency na czymś, co nie jest elementem szkieletowym, należy użyć metody statycznej: BindingOperations.SetBinding. W moim przypadku wynik końcowy był mniej więcej taki:

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); 
Powiązane problemy