2011-10-11 13 views
5

के लिए डाटाबेसिंग का उपयोग कैसे कर सकता हूं मेरे पास मेरे व्यूमोडेल में आइटम का एक गुच्छा है जिसे मैं व्यूपोर्ट 3 डी का उपयोग करके 3 डी में प्रस्तुत करने जा रहा हूं। यूआई के प्रासंगिक टुकड़े इस तरह के रूप में परिभाषित किया जाता है:मैं 3 डी तत्वों जैसे विजुअल 3 डी या UIElement3D

<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 फ्रेमवर्क एलिमेंट से प्राप्त नहीं होता है, इसलिए कोई सेटबाइंडिंग विधि नहीं है और इस प्रकार कोड से बाइंडिंग निर्दिष्ट करने का कोई स्पष्ट तरीका नहीं है।

ध्यान दें कि बाध्यकारी काम करता है को बदलने 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 के लिए उपयोग नहीं है?

उत्तर

6

मुझे अपने स्वयं के प्रश्न का उत्तर मिला, इसलिए मैं इसे बाद में इस पृष्ठ को ढूंढने वाले अन्य लोगों के लाभ के लिए यहां पोस्ट कर रहा हूं।

किसी फ्रेमवर्क तत्व पर निर्भरता संपत्ति पर बाध्यकारी बनाने के लिए, आप स्थिर 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);