2013-03-07 4 views
11

मेरे पास एकाधिक टेक्स्टब्लॉक हैं जो मेरे आवेदन में विभिन्न तत्वों का संदर्भ देते हैं। पृष्ठ में सीधे उपयोग किए जाने पर मेरा कोड ठीक काम करता है। हालांकि, मैं कोड के डुप्लिकेशन को कम करने के लिए एक ControlTemplate और ContentControl बनाना चाहता हूं।मैं ControlTemplate में एलीमेंटनाम बाइंडिंग का उपयोग कैसे कर सकता हूं?

टेम्पलेट बाइंडिंग का उपयोग कर ContentControl से ControlTemplate में ElementName के संदर्भ को मैं कैसे पास कर सकता हूं?

"Cannot convert the value in attribute 'ElementName' to object of type 'System.String'. Object of type 'System.Windows.TemplateBindingExpression' cannot be converted to type 'System.String'. "

टैग विशेषता के अलावा, मैं कोशिश की है ContentStringFormat जो भी काम नहीं किया: निम्न कोड इस त्रुटि फेंकता है।

टेम्पलेट्स का उपयोग करके इसे काम करने के लिए सही तरीका क्या है?

आपकी मदद के लिए अग्रिम धन्यवाद,

--- शॉन

यहाँ कोड नमूना है:

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" > 
    <Page.Resources> 
     <ControlTemplate x:Key="MyTemplate" TargetType="{x:Type ContentControl}"> 
      <TextBlock Margin="{Binding ElementName={TemplateBinding Tag}, Path=Margin}" Text="{TemplateBinding Content}" TextAlignment="{Binding ElementName={TemplateBinding Tag}, Path=TextAlignment}" Width="{Binding ElementName={TemplateBinding Tag}, Path=Width}" /> 
     </ControlTemplate> 
    </Page.Resources> 
    <StackPanel> 
     <TextBlock x:Name="AnotherElement" Margin="10" Text="Main TextBlock" TextAlignment="Center" Width="100" /> 
     <TextBlock x:Name="AnotherElement2" Margin="20" Text="Second TextBlock" TextAlignment="Left" Width="250" /> 
     <TextBlock Margin="{Binding ElementName=AnotherElement, Path=Margin}" Text="Here is my TextBlock!" TextAlignment="{Binding ElementName=AnotherElement, Path=TextAlignment}" TextTrimming="CharacterEllipsis" Width="{Binding ElementName=AnotherElement, Path=Width}" /> 
     <TextBlock Margin="{Binding ElementName=AnotherElement2, Path=Margin}" Text="Here is my Second TextBlock!" TextAlignment="{Binding ElementName=AnotherElement2, Path=TextAlignment}" TextTrimming="CharacterEllipsis" Width="{Binding ElementName=AnotherElement2, Path=Width}" /> 
     <ContentControl Content="Hello!" Tag="AnotherElement" Template="{StaticResource MyTemplate}" /> 
     <ContentControl Content="Hello Again!" Tag="AnotherElement2" Template="{StaticResource MyTemplate}" /> 
    </StackPanel> 
</Page> 
+1

शैली क्यों नहीं बनाते और उन सभी नियंत्रणों पर लागू होते हैं जिन्हें उस शैली की आवश्यकता होती है? आप एक संपत्ति पर कुछ संपत्ति को परिभाषित क्यों करना चाहते हैं और उसके बाद अन्य नियंत्रण बांधना चाहते हैं? यह सबसे अच्छा अजीब लगता है। –

+0

@ ब्रेंट एक टैग प्रॉपर्टी में जानकारी संग्रहीत करना एमएस एक्सेस फॉर्म डेवलपमेंट के साथ एक तकनीक थी। यह आपके नियंत्रण पर कुछ संपत्ति/हैंडलर से बंधे वीबीए फ़ंक्शन को कुछ हार्डकोडेड मान पास करने का एक सस्ता और बुरा तरीका था। हमें डब्लूपीएफ में इसकी आवश्यकता नहीं है क्योंकि हमारे पास हमारे निपटारे में उपकरण की विस्तृत श्रृंखला है =) – failedprogramming

+0

@ ब्रेंटस्टवार्ट इस कार्यान्वयन का अंतिम परिणाम एमवीवीएम, बाइंडिंग्स, डेटा टेम्पलेट्स आदि का उपयोग करके कॉलम में जानकारी प्रदर्शित कर रहा है। मैंने अपना उदाहरण विशेष रूप से घटाया इस साइट पर पूछने के लिए। मैंने ग्रिड का उपयोग नहीं करना चुना और इसके बजाय एक रैपपैनल का उपयोग किया क्योंकि मुझे लगा कि यह उपयोग करना आसान और साफ था। मैं एक टेक्स्टब्लॉक के कई गुणों को बाध्यकारी कर रहा हूं क्योंकि मैं अपने कॉलम मान को अपने विशिष्ट शीर्षलेख (मार्जिन, चौड़ाई, संरेखण इत्यादि) के लिए निर्धारित गुणों की प्रतिलिपि बनाना चाहता हूं। शैलियों का उपयोग करके आप इसे कैसे कार्यान्वित करेंगे जब प्रत्येक टेक्स्टब्लॉक के लिए यह एक अलग तत्वनाम का संदर्भ देगा? –

उत्तर

23

यह कुछ टेम्पलेट एक अजीब तरह से की तरह लगता है, लेकिन यह हो सकता है किया, आपको बस अपनी बाइंडिंग के साथ थोड़ी कल्पना करना है।

नीचे काम करेंगे, लेकिन मैं अब भी लगता है कि यह एक नियंत्रण

बाइंड टेम्पलेट एक अच्छा तरीका है न TextBlockTag वास्तविक तत्व है, तो ControlTemplate बाँध में TagTag करने और वहाँ से मूल्यों का उपयोग चूंकि टैग तत्व है, आप इससे किसी भी तत्व का उपयोग कर सकते हैं।

<Page.Resources> 
    <ControlTemplate x:Key="MyTemplate" TargetType="{x:Type ContentControl}"> 
     <TextBlock Name="_this" Tag="{TemplateBinding Tag}" Margin="{Binding ElementName=_this, Path=Tag.Margin}" Text="{TemplateBinding Content}" TextAlignment="{Binding ElementName=_this, Path=Tag.TextAlignment}" Width="{Binding ElementName=_this, Path=Tag.Width}" /> 
    </ControlTemplate> 
</Page.Resources> 
<StackPanel> 
    <TextBlock x:Name="AnotherElement" Margin="10" Text="Main TextBlock" TextAlignment="Center" Width="100" /> 
    <TextBlock x:Name="AnotherElement2" Margin="20" Text="Second TextBlock" TextAlignment="Left" Width="250" /> 
    <TextBlock Margin="{Binding ElementName=AnotherElement, Path=Margin}" Text="Here is my TextBlock!" TextAlignment="{Binding ElementName=AnotherElement, Path=TextAlignment}" TextTrimming="CharacterEllipsis" Width="{Binding ElementName=AnotherElement, Path=Width}" /> 
    <TextBlock Margin="{Binding ElementName=AnotherElement2, Path=Margin}" Text="Here is my Second TextBlock!" TextAlignment="{Binding ElementName=AnotherElement2, Path=TextAlignment}" TextTrimming="CharacterEllipsis" Width="{Binding ElementName=AnotherElement2, Path=Width}" /> 
    <ContentControl Content="Hello!" Tag="{Binding ElementName=AnotherElement}" Template="{StaticResource MyTemplate}" /> 
    <ContentControl Content="Hello Again!" Tag="{Binding ElementName=AnotherElement2}" Template="{StaticResource MyTemplate}" /> 
</StackPanel> 
+2

+1 यह बताते हुए कि यह टेम्पलेट को नियंत्रित करने का एक अच्छा तरीका नहीं है। –

+14

आपके उत्तर के लिए धन्यवाद। यह काम करता है क्योंकि मैं इसे अपने आवेदन में करना चाहता हूं। आप और @ ब्रेंटस्टवार्ट दोनों राज्य यह टेम्पलेट को नियंत्रण के लिए एक अच्छा तरीका नहीं है। आपके विकल्प में, एक अच्छा तरीका क्या है और यह क्यों नहीं है? –

+3

हाँ वहां कोई विकल्प नहीं है, इसलिए यह मूर्खतापूर्ण कहने के लिए "यह करने का एक अच्छा तरीका नहीं है"। जाहिर है, लेकिन क्या अन्य विकल्प उपलब्ध हैं? जिस तरह से दृश्य पेड़ तैयार किया गया है, इस तरह के प्रतिबंध इतनी बार आते हैं। – user99999991

संबंधित मुद्दे