2011-11-23 8 views
6

मैं अपनी पूरी xaml फ़ाइल कॉपी/पेस्ट नहीं करूंगा। यह भी यह समझाने के लिए लंबे समय तक हो सकता है लेकिन यहाँ क्या दिलचस्प है जाएगा: मैं एक संपत्ति "नाम"दूसरी संपत्तियों के लिए बाध्यकारी यदि पहला "अनिर्धारित" है

<TextBlock Text="{Binding Name}"/> 

बात यह है कि कभी कभी, मेरे आइटम एक "नाम" संपत्ति नहीं है की एक बाध्यकारी हो गया। यह क्रैश नहीं होता है लेकिन मुझे बस अपने टेक्स्टब्लॉक

में एक खाली टेक्स्ट मिला है, यदि नाम खाली है, तो मुझे क्या करना होगा, "कुछ भी नहीं", बस {बाध्यकारी} से बांधना है। यह मेरा ऑब्जेक्ट नाम प्रदर्शित करेगा और यह सही होगा!

किसी भी मदद के लिए अग्रिम धन्यवाद, और खेद अगर यह एक noobie सवाल :(है

उत्तर

6

क्या तुम यहाँ चाहते हैं एक PriorityBinding है।

विशेष रूप से, यह कुछ इस तरह दिखाई (सटीक सिंटैक्स कुछ सत्यापन की आवश्यकता हो सकती) होगा:

  <TextBlock> 
      <TextBlock.Text> 
       <PriorityBinding> 
        <Binding Path="Name"/> 
        <Binding /> 
       </PriorityBinding> 
      </TextBlock.Text> 
     </TextBlock> 

ध्यान दें कि यह विशेष रूप से वापस हो जाता है जब नाम संपत्ति वस्तु बाध्य किया जा रहा है पर उपलब्ध नहीं है; अगर नाम संपत्ति में एक खाली स्ट्रिंग मान है, तो मेरा मानना ​​है कि यह अभी भी उस खाली मूल्य का उपयोग करेगा।

+0

स्वीकार नहीं किया गया है लेकिन आपका समाधान लगता है महान ! –

+0

प्रयास करें: <बाइंडिंग पथ = "नाम" />

+1

@Guillaume, डायलन को दिखाने के लिए यह संपादित पूर्ण वाक्यविन्यास; सामान्य रूप से, ' 'एक इनलाइन मान के बजाय, अधिक जटिल निर्माण के साथ किसी संपत्ति के मूल्य को सेट करने के लिए XAML वाक्यविन्यास है। '{बाध्यकारी ...}' मार्कअप एक्सटेंशन इन 'बाध्यकारी' वर्ग उदाहरण बनाने के लिए सिर्फ एक शॉर्टकट है। एक्सएएमएल कंपाइलर तब कुछ अतिरिक्त विशेष-केस जादू करता है, यह समझने के लिए कि टेक्स्ट एक निर्भरता प्रॉपर्टी है, इसलिए यह मान को बाध्यकारी में 'सेट' करने की अनुमति देता है, जो इसे चीजों को तार करने के लिए आवश्यक विभिन्न बाध्यकारी निष्पादन कार्यों को कॉल करके संभालता है। –

0

क्या आप TargetNullValue इस्तेमाल कर सकते हैं ऑब्जेक्ट प्रकार का नाम है जिसमें आप एक डिफ़ॉल्ट मान है, तो दे देंगे करने के लिए बाध्य करने के लिए नहीं है, तो बाध्य संपत्ति, रिक्त है इस तरह:

<TextBlock Text="{Binding Name, TargetNullValue=Default}" /> 

तुम सच में ऑब्जेक्ट प्रकार नाम मैं एक कनवर्टर (IValueConverter लागू) लेखन सुझाव है कि चाहते हैं मुझे पता है अगर आप एक नमूना कनवर्टर चाहते हैं

+0

अपने कोड के साथ, मेरे ऑब्जेक्ट्स में अभी भी खाली टेक्स्टब्लॉक हैं जब मेरी ऑब्जेक्ट्स किसी भी नाम की संपत्ति रखती हैं। पता नहीं है कि यह इरादा है या नहीं। कनवर्टर के बारे में, मुझे वास्तव में पता नहीं है, मुझे आश्चर्य की बात है कि हम इसे xaml फ़ाइल में नहीं करते हैं! –

+0

संपत्ति बाध्यकारी इस स्थिति में विफल हो जाएगी, इसलिए TargetNullValue कभी भी उपयोग नहीं किया जाएगा। यदि आप लक्ष्य से जुड़ने में विफल रहे हैं तो आपके पास लक्ष्य के लिए शून्य मूल्य नहीं हो सकता है। –

+0

क्षमा करें, मुझे समझ में नहीं आया कि संपत्ति गुम थी, मैंने सोचा कि यह शून्य था ("अगर नाम खाली है")। मेरी गलती। –

0

यह।। सैद्धांतिक है लेकिन ..

मैं एक कस्टम शैली तैयार करूंगा और अपने सभी टेक्स्टब्लॉक को लक्षित करूंगा। अपनी शैली के अंदर, आप एक डिफ़ॉल्ट पाठ मान सेट कर सकते हैं। यदि आपका बाध्यकारी शैली को ओवरराइड नहीं करता है, तो आपका डिफ़ॉल्ट मान उपयोग किया जाएगा।

Style x:Key="TwitterTextBoxStyle" TargetType="{x:Type TextBox}"> 
    <Setter Property="Text" Value="" /> 
+0

मैं डिफ़ॉल्ट मान को एक और बाध्यकारी होना चाहता हूं, स्थिर मूल्य नहीं :( –

3

आप एक DataTrigger के साथ एक शैली लागू कर सकते हैं:

<TextBlock> 
    <TextBlock.Style> 
     <Style TargetType="TextBlock"> 
      <Setter Property="Text" Value="{Binding Name}"/> 
      <Style.Triggers> 
       <!-- In this binding you could inject a converter which checks for more than null --> 
       <DataTrigger Binding="{Binding Name}" Value="{x:Null}"> 
        <Setter Property="Text" Value="{Binding}"/> 
       </DataTrigger> 
      <Style.Triggers> 
     </Style> 
    </TextBlock.Style> 
</TextBlock> 
+0

काम करने लगता है लेकिन मुझे कुछ सुनिश्चित करने के लिए कुछ पता होना चाहिए, जब मैं बस {बाइंडिंग} का उपयोग करता हूं। फ़ील्ड को किस संपत्ति से बांध दिया जाता है? –

+0

@Guillaume, '{बाध्यकारी} 'का अर्थ है वर्तमान डेटा कॉन्टेक्स्ट के मूल्य का उपयोग संपत्ति को असाइन करने के लिए मूल्य के रूप में करना। दूसरे शब्दों में एक खाली पथ का अर्थ केवल ऑब्जेक्ट इंस्टेंस का उपयोग अपने गुणों में से एक के बजाय करें। यहां एक आसान धोखा शीट है बाइंडिंग सिंटैक्स: http://www.nbdtech.com/Free/WpfBinding.pdf –

+1

@GuillaumeCogranne {बाइंडिंग} आपके वर्तमान डेटा संदर्भ को सेट करने के लिए बाध्य होगा।तो किसी वर्ग की नाम संपत्ति के लिए बाध्यकारी होने की बजाय, आप उस श्रेणी से जुड़ें जिसमें नाम संपत्ति है। –

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