2011-08-19 11 views
10

में सेट किया गया यह व्यवहार मेरे लिए अविश्वसनीय रूप से अजीब लगता है, और मुझे लगता है कि मैं इसे प्राप्त करने में कुछ गलत कर रहा हूं। मेरे पास ContentControl है जो TabControl प्रस्तुत करने के लिए डेटा टेम्पलेट का उपयोग करता है। मैं एक छवि को प्रदर्शित करना चाहता हूं जब कोई टैब खुलता न हो, और वहां होने पर छिपाएं। लेकिन यहां समस्या है:WPF ट्रिगर गुण सेट नहीं करेगा यदि एलिमेंट

<Image Name="image1" Stretch="Uniform" Visibility="Hidden" Source="/Affinity;component/Images/affinity_logo.png"> 
      <Image.Style> 
       <Style TargetType="Image"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding Items.Count, ElementName=tabcontrolworkspaces}" 
         Value="0"> 
          <Setter Property="Visibility" Value="Visible" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </Image.Style> 
     </Image> 

यह काम नहीं करता है ... प्रकार।

मैंने विज़िबिलिटी और मार्जिन (बस सुनिश्चित करने के लिए) पर इसका परीक्षण किया है। यह ट्रिगर संपत्ति को बदल देगा, जब तक कि उस संपत्ति को Image टैग में परिभाषित नहीं किया जाता है। यदि ऐसा है, तो ट्रिगर उस संपत्ति को अपडेट नहीं करेगा। इसलिए, अगर मैं छवि के लिए दृश्यता परिभाषित नहीं करता हूं, और ट्रिगर इसे छुपाता है, तो यह काम करता है। समस्या यह है कि डिफ़ॉल्ट दृश्यमान है और ट्रिगर को इसे दिखाने की आवश्यकता होती है जब मूल्य = 0 और अन्यथा इसे छुपाएं।

ट्रिगर क्यों स्पष्ट रूप से परिभाषित गुणों को ओवरराइड नहीं करेगा? क्या इसका उद्देश्य नहीं है?

+0

क्या आपने इसे दूसरी तरफ स्थापित करने का प्रयास किया है? जैसा कि, वैल्यू! = "0" दृश्यता को दृश्यमान करने के लिए सेट नहीं करता है? – mydogisbox

+0

क्या आप इसका उपयोग भी कर सकते हैं! = ट्रिगर वैल्यू में? – Tyrsius

+0

सीधे नहीं, लेकिन कुछ प्रयासों के साथ यह किया जा सकता है। @CodeNaked एक बेहतर समाधान है। अवांछित समाधान यहां है। http://blogs.msdn.com/b/mikehillberg/archive/2008/09/30/comparabledatatrigger.aspx – mydogisbox

उत्तर

18

यह सामान्य Dependency Property Value Precedence है। इसे छवि पर सेट करना # 3 पर है, जबकि स्टाइल ट्रिगर में # 6 की निम्न प्राथमिकता है।

आप इस के बजाय कर सकते हैं:

<Image Name="image1" Stretch="Uniform" Source="/Affinity;component/Images/affinity_logo.png"> 
    <Image.Style> 
     <Style TargetType="Image"> 
      <Setter Property="Visibility" Value="Hidden" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Items.Count, ElementName=tabcontrolworkspaces}" 
        Value="0"> 
        <Setter Property="Visibility" Value="Visible" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Image.Style> 
</Image> 
+0

+1 मैंने हमेशा सोचा कि मुझे कभी-कभी शैली में सेटर सेट करने के साथ-साथ ट्रिगर के लिए ट्रिगर सेट करने की आवश्यकता क्यों होती है काम करने के लिए – Rachel

+0

यह डिफ़ॉल्ट मान या मेटाडेटा से विरासत में प्राप्त मान पर लागू नहीं होता है। मेरा जवाब देखें कि आपको ट्रिगर के साथ सेट करने के अलावा सेटटर में मान क्यों सेट करना होगा। – mydogisbox

+0

@mydogisbox - मुझे यकीन नहीं है कि आपका क्या मतलब है। यदि ट्रिगर ने दृश्यता को छिपाने के लिए सेट किया है और ट्रिगर के बाहर कोई अतिरिक्त सेटर नहीं था, तो जब ट्रिगर अब लागू नहीं होता है तो यह इसे डिफ़ॉल्ट मान (जो दृश्यमान) पर पुनर्स्थापित करेगा। – CodeNaked

6

कई बार है, जहां कभी कभी DataTrigger Setters जीता उत्प्रेरक

में के अलावा शैली में अपने दृश्यता सेट मैं DataTriggers के साथ इस अजीब व्यवहार का सामना करना पड़ा स्टाइल में सेटर को भी परिभाषित नहीं किया जाता है जब तक प्रभावी नहीं होता है।

काम नहीं करेंगे

<Image Visibility="Collapsed"> 
    <Image.Style> 
     <Style TargetType="Image"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Something}" Value="0"> 
        <Setter Property="Visibility" Value="Visible" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    <Image.Style> 
</Image> 

काम करेगा

<Image> 
    <Image.Style> 
     <Style TargetType="Image"> 
      <Setter Property="Visibility" Value="Collapsed" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Something}" Value="0"> 
        <Setter Property="Visibility" Value="Visible" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    <Image.Style> 
</Image> 

संपादित करें: क्यों यह काम नहीं करता पर एक विवरण के लिए the accepted answer देखें। इसे उस आदेश के साथ करना है जिसमें निर्भरता गुण निर्धारित किए जाते हैं, जहां <Tag> में परिभाषित गुण हमेशा ट्रिगर किए गए मानों पर प्राथमिकता लेते हैं।

0

जब कोई ट्रिगर सत्य होता है तो यह वांछित मान को मान बदलता है। जब यह अब सत्य नहीं होता है तो यह पिछले मान के मान को वापस कर देता है। यह इसे उस मूल्य में नहीं बदलेगा जो इसे नहीं करेगा।

इसका मतलब है कि यदि मूल मान दिखाई देता है, और जब आप ट्रिगर सक्रिय नहीं होते हैं, तो आप इसे दृश्यमान में बदल देते हैं, तो मान वापस दिखाई देगा।

+0

उनके नमूने में मूल मूल्य दृश्यमान नहीं है, यह छिपा हुआ है। – CodeNaked

+0

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

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