2009-08-01 16 views
32

मुझे लगता है कि यह संभव है, लेकिन स्पष्ट तरीका काम नहीं कर रहा है।सामग्री कंट्रोल में डिफ़ॉल्ट डेटा टेम्पलेट प्रदर्शित करें जब इसकी सामग्री शून्य या खाली हो?

वर्तमान में, मैं यह कर रहा हूँ:

<ContentControl 
    Content="{Binding HurfView.EditedPart}"> 
    <ContentControl.Resources> 
     <Style 
      TargetType="ContentControl" 
      x:Key="emptytemplate"> 
      <Style.Triggers> 
       <DataTrigger 
        Binding="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=Content}" 
        Value="{x:Null}"> 
        <Setter 
         Property="ContentControl.Template"> 
         <Setter.Value> 
          <ControlTemplate> 
           <Grid 
            HorizontalAlignment="Stretch" 
            VerticalAlignment="Stretch"> 
            <TextBlock>EMPTY!</TextBlock> 
           </Grid> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ContentControl.Resources> 
</ContentControl> 

मैं किसी भी बाध्यकारी त्रुटियों नहीं मिल रहा है और इस संकलित करता है। हालांकि, यह अपेक्षित परिणाम नहीं उत्पन्न करता है। मैंने स्पष्ट भी कोशिश की है:

<DataTemplate DataType="{x:Null}"><TextBlock>Hurf</TextBlock></DataTemplate> 

यह संकलित नहीं होगा। और सामग्री सेट करने का प्रयास दो बार के रूप में अच्छी तरह से विफल रहता है:

<ContentControl 
    Content="{Binding HurfView.EditedPart}"> 
     <TextBlock>DEFAULT DISPLAY</TextBlock> 
</ContentControl> 

मैं यह कर सकता एक कस्टम टेम्पलेट चयनकर्ता लेखन के बिना? आप शैली में सामग्री संपत्ति के लिए बाध्य करने के लिए है

<DataTemplate DataType="{x:Type system:DBNull}"> 
    <!-- The default template --> 
</DataTemplate> 

... 

<ContentControl Content="{Binding HurfView.EditedPart, FallbackValue={x:Static system:DBNull.Value}}" /> 

उत्तर

45

सरल,:

+0

काम किया! धन्यवाद। – Will

+0

शैलियों और ट्रिगरों के साथ अधिक जटिल चीजों को करने की कोशिश करते समय लोगों को एक बहुत ही आम गलती होती है। –

+1

हर बार जब मैं इसके लिए वापस आ जाता हूं तो मैं एक टिप्पणी छोड़ने जा रहा हूं। धन्यवाद। – Will

1

आप DBNull के लिए ContentControl की सामग्री के लिए बाइंडिंग का FallbackValue रूप DBNull.Value लौट सकता है, और बनाने के एक DataTemplate। यदि कोई बाध्यकारी उपस्थिति है, तो स्टाइल शून्य पर मूल्यांकन करने के बावजूद नियंत्रण पर एक मान को ओवरराइट नहीं करेगा। इसे इस्तेमाल करे।

<ContentControl> 
    <ContentControl.Style> 
     <Style TargetType="ContentControl"> 
      <Setter Property="Content" Value="{Binding HurfView.EditedPart}" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=Content}" Value="{x:Null}"> 
        <Setter Property="ContentControl.Template"> 
         <Setter.Value> 
          <ControlTemplate> 
           <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
            <TextBlock>EMPTY!</TextBlock> 
           </Grid> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ContentControl.Style> 
</ContentControl> 
+4

कि थोड़े अजीब है ... यह मेरी समझ गया था पसंदीदा तरीका वापस लौटना था [निर्भरताप्रॉपर्टी.उन्सेट वैल्यू] (http://msdn.microsoft.com/en-us/library/system.windows.dependencyproperty.unsetvalue.aspx)। मैंने इसे कुछ प्रकार के कनवर्टर्स में किया है और यह अच्छी तरह से काम किया है ... – Will

+2

@Will, हाँ, यह शायद बेहतर होगा। मैंने उस जवाब को एक साल पहले लिखा था, और उस समय डब्ल्यूपीएफ की मेरी समझ अभी भी बहुत अपूर्ण थी ... –

+0

मुझे एहसास है ... – Will

9

के बाद से मैं इस सवाल पर ठोकर खाई और आज एक ही समस्या थी, मैं एक और तरीका है कि कैसे मैं समस्या हल योगदान करना चाहता था। जब से मैं मैं संपत्ति TargetNullValue जो स्वीकार किए जाते हैं समाधान की तुलना में थोड़ा अधिक पठनीय हो रहा है (जो फिर भी काम करता है) का इस्तेमाल किया एक और शैली ट्रिगर जोड़ने के लिए पसंद नहीं आया:

<ContentControl> 
     <ContentControl.Content> 
     <Binding Path="ContentViewModel"> 
      <Binding.TargetNullValue> 
      <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
       <TextBlock>EMPTY!</TextBlock> 
      </Grid> 
      </Binding.TargetNullValue> 
     </Binding> 
     </ContentControl.Content> 
    </ContentControl> 
+0

यह TargetNullValue के साथ एक सुरुचिपूर्ण समाधान है। अच्छा लगता है – juFo

+0

अगर मैं 10k अपवॉट दे सकता हूं ... – curob

+0

काम करता है, लेकिन मेरे जैसे कुछ मामलों में यह बाध्यकारी-त्रुटियों का उत्पादन करता है। हालांकि मुझे यह भी लगता है कि यह एक और अधिक पठनीय है, इसका उपयोग करते समय नई बाध्यकारी-त्रुटियों की जांच करें। – Dima

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