2011-10-11 17 views
5

Tôi có một loạt các mục trong viewmodel của tôi mà tôi sẽ render trong 3D bằng cách sử dụng Viewport3D. Các mảnh có liên quan của giao diện người dùng được định nghĩa như vậy:Làm thế nào tôi có thể sử dụng databinding cho các phần tử 3D như Visual3D hoặc UIElement3D

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

(tôi bỏ qua ánh sáng và máy ảnh từ XAML trên nhưng tất nhiên đó cũng có trong mã của tôi)

Bây giờ tôi muốn điều khiển tùy chỉnh của tôi để hiển thị tất cả các mục (từ thuộc tính phụ thuộc Items mà tôi đã xác định) là các phần tử riêng lẻ UIElement3D được định vị tại vị trí được chỉ định bởi đối tượng bị ràng buộc của chúng.

Cách tiếp cận của tôi cho đến nay là ghi đè GetVisual3DChild và các phương pháp/thuộc tính liên quan để thiết lập mối quan hệ cha-con cho các mục của tôi. Vấn đề mà tôi đang phải đối mặt là làm thế nào để dữ liệu liên kết biến đổi dịch của con với các giá trị được định nghĩa trong đối tượng bị ràng buộc của tôi - Vì UIElement3D không lấy được từ FrameworkElement, không có phương thức SetBinding và do đó không có cách rõ ràng để xác định ràng buộc từ mã.

Lưu ý rằng ràng buộc biến đổi tác phẩm tốt trong 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> 

Làm thế nào tôi có thể tạo ra trên ràng buộc từ mã, khi tôi không có quyền truy cập vào FrameworkElement.SetBinding?

Trả lời

6

Tôi đã tìm thấy câu trả lời cho câu hỏi của riêng mình, vì vậy tôi đăng câu hỏi ở đây vì lợi ích của những người khác khi tìm trang này sau.

Để tạo liên kết trên thuộc tính phụ thuộc vào nội dung không phải là yếu tố khung, bạn sử dụng phương thức tĩnh BindingOperations.SetBinding. Trong trường hợp của tôi, kết quả cuối cùng là một cái gì đó như thế này:

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ác vấn đề liên quan