2010-09-03 16 views
13

का उपयोग करते हुए नेस्टेड तत्व के भीतर से मूल संपत्ति के लिए WPF बाध्य करें मैं खाली होने के दौरान प्रदर्शित होने वाले संकेत के साथ एक टेक्स्ट बॉक्स बनाने की कोशिश कर रहा हूं। मुझे एक शैली के भीतर से संकेत पाठ सेट करने में परेशानी हो रही है।शैली

सटीक होना, इस काम करता है (कि इसे सही ढंग से बांधता है,):

<TextBox Tag="hint text"> 
     <TextBox.Background> 
      <VisualBrush Stretch="None"> 
       <VisualBrush.Visual> 
        <TextBlock Text="{Binding Tag, RelativeSource={RelativeSource AncestorType=TextBox}}" FontStyle="Italic" Foreground="LightGray" /> 
       </VisualBrush.Visual> 
      </VisualBrush> 
     </TextBox.Background> 
    </TextBox> 

लेकिन, जब मैं यह शैली के लिए ले जाते हैं, यदि ऐसा नहीं होता:

<Style TargetType="TextBox" x:Key="stlHintbox"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Text, RelativeSource={RelativeSource Mode=Self}}" Value=""> 
      <Setter Property="Background"> 
       <Setter.Value> 
        <VisualBrush Stretch="None"> 
         <VisualBrush.Visual> 
          <TextBlock Tag="inner" Text="{Binding Tag, RelativeSource={RelativeSource AncestorType=TextBox}}" 
             FontStyle="Italic" Foreground="LightGray" /> 
         </VisualBrush.Visual> 
        </VisualBrush> 
       </Setter.Value> 
      </Setter> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

<TextBox Tag="hint text" Style="{StaticResource stlHintbox}" /> 

तो कैच है? मैं शैली के भीतर से पूर्वजों की संपत्ति से कैसे बंध सकता हूं?

उत्तर

12

समस्या RelativeSource साथ नहीं है, लेकिन जिस तरह से साथ आप VisualBrush उपयोग कर रहे हैं। याद रखें कि शैलियों को उन तत्वों के बीच साझा किया जाता है जिन्हें आप उन्हें लागू करते हैं। आपका उदाहरण काम नहीं करने का कारण यह है कि, असल में आप एक ही टेक्स्टबॉक्स (जिसे आपने "आंतरिक" टैग किया है) को एकाधिक पैरेंट टेक्स्टबॉक्स के साथ साझा करने का प्रयास कर रहे हैं।

यह देखने के लिए कि यह एक समस्या क्यों है, एक विचार प्रयोग का प्रयास करें: आंतरिक टेक्स्टबॉक्स एक बार बनाया जाता है (मोटे तौर पर बोलते हुए, यह तब होता है जब शैली बनाई जाती है)। जब आप रिलेटिवसोर्स बाइंडिंग का उपयोग करते हैं तो किस टेक्स्टबॉक्स को स्टाइल लागू किया जाता है, उसे आंतरिक टेक्स्ट बॉक्स के पूर्वजों के रूप में चुना जाना चाहिए?

यही कारण है कि DataTemplates और ControlTemplates WPF में मौजूद है। वास्तव में दृश्यों को तुरंत चालू करने के बजाय, वे एक टेम्पलेट को परिभाषित करते हैं जो आवश्यकतानुसार दृश्यों की कई प्रतियों को बनाने की अनुमति देता है।

+0

ठीक है, यह वास्तव में समझ में आता है ... मैं पुस्तकों के माध्यम से बहुत जल्दी लगता है :) – veljkoz

5

पुनर्विक्रय अपेक्षा के अनुसार काम नहीं करता है। नियंत्रण टेम्पलेट का उपयोग कर वॉटरमार्क टेक्स्टबॉक्स बनाना बेहतर है। लेकिन अपने संस्करण काम कर सकता था:

<Window.Resources> 
    <Style TargetType="TextBox" x:Key="stlHintbox"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Text, RelativeSource={RelativeSource Mode=Self}}" Value=""> 
       <Setter Property="TextBox.Background"> 
        <Setter.Value> 
         <VisualBrush Stretch="None" Visual="{Binding ElementName=hintText}"/> 
        </Setter.Value> 
       </Setter> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 
<StackPanel> 
    <TextBox Tag="hint text" x:Name="myTextBox" Style="{StaticResource stlHintbox}" /> 
    <Border Visibility="Hidden"> 
     <TextBlock x:Name="hintText" Text="{Binding Tag, ElementName=myTextBox}" FontStyle="Italic" Foreground="LightGray" /> 
    </Border> 
</StackPanel> 
+0

यह ठीक है, लेकिन यह मुझे एक ही विंडो में एक से अधिक हिंटबॉक्स रखने से रोकता है, और इसका उपयोग स्पष्ट नहीं होगा। नियंत्रण टेम्पलेट्स पर सुझाव के लिए धन्यवाद, मैं इसे और अधिक देखूंगा ... – veljkoz

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