2009-05-15 10 views
15

मेरे पास TextBlock और TextBox नियंत्रण की एक श्रृंखला है। क्या Style को TextBlock पर लागू करने का कोई तरीका है ताकि वे तुरंत उनके बाद नियंत्रण में डाटाबेस कर सकें?डब्ल्यूपीएफ में, क्या भाई गुणों को बांधने का कोई तरीका है?

मैं इस तरह कुछ करने के लिए सक्षम होने के लिए करना चाहते हैं:

<Resources..> 
    <Style x:Key="BindToFollowingTextBoxSibling"> 
     <Setter Property="TextBlock.Text" Value="{Binding RelativeSource={RelativeSource FollowingSibling}, Path=Text, Converter={StaticResource MyConverter}}" /> 
     <Setter Property="TextBlock.Background" Value="{Binding RelativeSource={RelativeSource FollowingSibling}, Path=Text, Converter={StaticResource TextToBrushConverter}}" /> 
     ... More properties and converters. 
    </Style> 
</Resources> 

... 

<TextBlock Style="{StaticResource BindToFollowingTextBoxSibling}"/> 
<TextBox/> 

<TextBlock Style="{StaticResource BindToFollowingTextBoxSibling}"/> 
<TextBox/> 
<TextBlock Style="{StaticResource BindToPreviousTextBoxSibling}"/> 

इस भी संभव तरह कुछ है?

उत्तर

14

मुझे लगता है कि इस मामले में तो सबसे अच्छा होगा ElementName द्वारा बाध्य किया जाता है:

<TextBlock Text="{Binding ElementName=textBox1, Path=Text}" /> 
<TextBox x:Name="textBox1">this is the textBox's 1 text</TextBox> 
<TextBlock Text="{Binding ElementName=textBox2, Path=Text}" /> 
<TextBox x:Name="textBox2">this is the textBox's 2 text</TextBox> 

यह कुछ इसी तरह प्राप्त करेंगे। क्या यह आपके लिए काम करता है?

+0

मैं क्या होने की संभावना करने के लिए जा रहा हूँ की तरह है कि। समस्या यह है कि कई गुण और कन्वर्टर्स हैं जिन्हें मैं बाध्यकारी लग रहा हूं, इसलिए यह हर संपत्ति के लिए ऐसा करने के लिए बहुत सारी प्रतिलिपि और अतीत हो जाती है। मैं सोच रहा हूं कि मैं ElementName द्वारा टेक्स्टब्लॉक टैग पर बाध्य हो सकता हूं और फिर मुझे आवश्यक गुण प्राप्त करने के लिए सापेक्ष स्रोत स्वयं का उपयोग कर सकता हूं। – Eclipse

+0

क्या यह कभी आपके लिए काम करता है? – Carlo

+0

मैंने केवल एक उपयोगकर्ता-नियंत्रण बनाया जो मुझे आवश्यक मामलों को संभाला। यह बस आसान था। – Eclipse

19

मुझे पता है कि यह एक पुराना धागा है, लेकिन मेरे पास है इस समस्या का हल। मैं आलंड ली के सुझाव का उपयोग करने में सक्षम था, here मिला। यह सीएसएस में जितना सामान्य नहीं है, लेकिन यदि आप मूल तत्व प्रकार को जानते हैं, तो यह अच्छी तरह से स्टाइल में भी काम करता है।

यहां एक उदाहरण दिया गया है कि मैंने इसका उपयोग कैसे किया। मेरे पास टेक्स्टबॉक्स नियंत्रण है जो फोकस करते समय "हाइलाइट रंग" के साथ रोशनी करता है। इसके अतिरिक्त, जब टेक्स्टबॉक्स ने फोकस किया था, तो मैं इसके संबंधित लेबल नियंत्रण को भी प्रकाश देना चाहता था। इसलिए मैंने लेबल नियंत्रण के लिए एक ट्रिगर लिखा जिसने इसे टेक्स्टबॉक्स नियंत्रण के समान तरीके से प्रकाश दिया। यह ट्रिगर एक कस्टम संलग्न संपत्ति द्वारा ट्रिगर किया जाता है जिसे IsFocusedByProxy कहा जाता है। तब मुझे लेबल की IsFocusedByProxy को टेक्स्टबॉक्स के IsFocused में बाध्य करने की आवश्यकता थी। इस बिंदु पर

<Grid x:Name="MaxGrid"> 
    <Label x:Name="MaxLabel" 
      Content="Max:" 
      c5:TagHelper.IsFocusedByProxy="{Binding 
            Path=Children[1].IsFocused, 
            RelativeSource={RelativeSource AncestorType=Grid}}" 
     /> 
    <c5:TextBoxC5Mediator x:Name="MaxTextBox"       
          DataContext="{Binding ConfigVm.Max_mediator}" /> 
</Grid> 

आप सोच रहे होंगे कि अपने किसी भी बस बाध्यकारी में ElementName का उपयोग करने से की तुलना में बेहतर नहीं: तो मैं इस तकनीक का इस्तेमाल किया। लेकिन अंतर यह है कि अब मैं इस बाध्यकारी एक शैली में पुनर्प्रयोग के लिए स्थानांतरित कर सकते हैं है:

<Setter Property="C5_Behaviors:TagHelper.IsFocusedByProxy" 
     Value="{Binding Path=Children[1].IsFocused, 
        RelativeSource={RelativeSource AncestorType=Grid}}" /> 

जब मैं एक दृश्य इन आवृत्तियां से भरा है और अब मैं कर सकते हैं, इस तरह (मैं सेटअप आवश्यक शैलियाँ करने के लिए परोक्ष लागू किया जा है, तो यही कारण है कि वहाँ) से पता चला कोई मार्कअप शैलियाँ सेट है:

<Grid x:Name="MaxGrid"> 
    <Label x:Name="MaxLabel" 
      Content="Max:" /> 
    <c5:TextBoxC5Mediator x:Name="MaxTextBox"       
          DataContext="{Binding ConfigVm.Max_mediator}" /> 
</Grid> 
<Grid x:Name="MinGrid"> 
    <Label x:Name="MinLabel" 
      Content="Min:" /> 
    <c5:TextBoxC5Mediator x:Name="MinTextBox"       
          DataContext="{Binding ConfigVm.Min_mediator}" /> 
</Grid> 
<Grid x:Name="StepFactorGrid"> 
    <Label x:Name="StepFactorLabel" 
      Content="Step Factor:" /> 
    <c5:TextBoxC5Mediator x:Name="StepFactorTextBox"       
          DataContext="{Binding ConfigVm.StepFactor_mediator}" /> 
</Grid> 
<!-- ... and lots more ... --> 

कौन सा मुझे इन परिणामों देता है:

किसी भी पाठ से पहले विभिन्न बक्सें फोकस प्राप्त के साथ

Before any TextBoxes have focus

: बक्से ध्यान केंद्रित किया

after focus 1

after focus 2

+6

+1 {{बाध्यकारी पथ = बच्चे [1] के लिए +1। IFFused, RelativeSource = {RelativeSource पूर्वज टाइप = ग्रिड}} '। –

+0

तो मैं पथ = बच्चों [1] में "1" मान रहा हूं ... सूचकांक है? यह मेरे लिए काम करता था, लेकिन संख्या मूल्य के अर्थ को स्पष्ट करना चाहता था। – EdwardM

+1

@EdwardM सही, 'पथ = बच्चे [1] 'में' 1' एक सूचकांक (पाठ्यक्रम का शून्य-आधारित सूचकांक) है। तो यदि आपकी संरचना अलग थी तो आप उस नंबर को समायोजित कर सकते थे। चीयर्स। –

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

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