2009-08-10 18 views
20

मैं कुछ समय से इस कोड के साथ संघर्ष कर रहा हूं और मुझे अपने प्रश्न का पूरा जवाब नहीं मिल रहा है।हालत बाध्यकारी विशेषता काम नहीं कर रहा है?

<ListView > 
    <ListView.ItemsPanel> 
     <ItemsPanelTemplate> 
     <StackPanel Margin="0,0,20,0" IsItemsHost="True" /> 
    </ItemsPanelTemplate> 
    </ListView.ItemsPanel> 
    <ListView.Items> 
     <TextBlock>Test1</TextBlock> 
     <TextBlock>Test2</TextBlock> 
     <TextBlock>Test3</TextBlock> 
     <TextBlock>Test4</TextBlock> 
     <TextBlock>Test5</TextBlock> 
    </ListView.Items> 
    <ListView.ItemContainerStyle> 
     <Style TargetType="{x:Type ListViewItem}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ListViewItem}"> 
        <Grid> 
         <ContentPresenter/> 
        </Grid> 
        <ControlTemplate.Triggers> 
         <MultiTrigger> 
          <MultiTrigger.Conditions> 
           <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="True" /> 
           <Condition Property="IsSelected" Value="True"/> 
          </MultiTrigger.Conditions> 
          <Setter Property="Visibility" Value="Collapsed"/> 
         </MultiTrigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     </Style> 
    </ListView.ItemContainerStyle> 
</ListView> 

MultiTrigger सेटिंग्स के अनुसार, चयनित आइटम फिर से प्रकट होना चाहिए जब माउस चयनित आइटम से अधिक नहीं रह गया है: मैं इस समस्या को वर्णन करने के लिए एक छोटा सा नमूना बना लिया है। यह कोड, हालांकि, "संपत्ति 'के लिए गैर-शून्य मान होना चाहिए, संदेश के साथ एक अवैधऑपरेशन अपवाद उत्पन्न करता है।" यदि आप "बाध्यकारी" विशेषता का उपयोग करने वाली स्थिति को हटाते हैं तो अपवाद नहीं फेंक दिया जाता है। एमएसडीएन दस्तावेज में यह बताता है कि आपके पास या तो संपत्ति या बाध्यकारी विशेषता सेट होना चाहिए। बाध्यकारी विशेषता जैसे उपरोक्त कोड फ़ंक्शन सेट नहीं हैं। असल में, मेरे सभी परीक्षण मामलों में, इससे कोई फ़र्क नहीं पड़ता कि बाध्यकारी विशेषता क्या सेट है; अपवाद अभी भी फेंक दिया गया है। कोई विचार?

उत्तर

52

यह उन समयों में से एक है जब आपको इसे चूसना पड़ता है और स्वीकार करते हैं कि आपने एक हड्डी की गलती की है। हालांकि, एक ही भाग्य से कुछ अन्य दुर्भाग्यपूर्ण आत्मा को बचाने के लिए, मैं अपना एपिफेनी प्रकट करूंगा।

सबसे पहले, अगर मैं प्रलेखन मैं बात यह है कि आप हालत के "बाइंडिंग" विशेषता उपयोग कर रहे हैं ने कहा कि पढ़ा है | के सभी पढ़ा था, यह एक MultiDataTrigger तत्व (बजाय MutiTrigger में शामिल किया जाना चाहिए मेरे पोस्ट उदाहरण में तत्व)।

दूसरा, उन परिवर्तनों को करने की बात है, MultiTrigger तत्व निम्न कोड के साथ की जगह है:

<MultiDataTrigger> 
    <MultiDataTrigger.Conditions> 
     <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="True" /> 
     <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True"/> 
    </MultiDataTrigger.Conditions> 
    <Setter Property="Visibility" Value="Collapsed"/> 
</MultiDataTrigger> 

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

किसी भी दर पर, उम्मीद है कि इससे किसी को भी उसी हड्डी की गलती करने में मदद मिलेगी!

+2

+1 boneheadedness स्वीकार और एक समाधान उपलब्ध कराने के लिए। कोई और इसके खिलाफ भाग जाएगा। "डेटा" शब्द को याद करना अनदेखा करना बहुत आसान है। –

+3

+1 वास्तव में समाधान करने के लिए मुझे वास्तव में शिकार और दस्तावेज़ीकरण के माध्यम से पढ़ने से बहुत तेज है। त्रुटि को दस्तावेज़ों पर भरोसा करने के बजाय इसे समझाया जाना चाहिए था। – jpierson

+1

+1 बस एक ही हड्डी के चलते कदम बना दिया। आपकी पोस्ट ने मुझे एक घंटा बचाया। –

3

एक बहुत ही समान नोट पर, मुख्य डेटा टेम्पलेट सामग्री के रूप में सीमा से IsMouseOver खींच रहा है, और पूर्वजों से IsSelected खींच रहा है। यह दिलचस्प है कि दोनों स्थितियों के पास एक सापेक्ष पथ होना चाहिए, मुझे लगता है कि डिफ़ॉल्ट पथ स्थानीय डेटाकॉन्टेक्स्ट होगा। उपर्युक्त समाधान के लिए धन्यवाद।

टूटी कोड

<MultiDataTrigger> 
    <MultiDataTrigger.Conditions> 
     <Condition Binding="{Binding Mode=OneWay, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}, Path=IsSelected}" 
        Value="True" /> 
     <Condition SourceName="Border" 
        Property="IsMouseOver" 
        Value="True" /> 
    </MultiDataTrigger.Conditions> 
    <Setter TargetName="Border" 
      Property="Background" 
      Value="{StaticResource OnBrushSelected}" /> 
</MultiDataTrigger> 

कार्य संहिता

<MultiDataTrigger> 
    <MultiDataTrigger.Conditions> 
     <Condition Binding="{Binding Mode=OneWay, RelativeSource={RelativeSource Self}, Path=IsMouseOver}" 
        Value="True" /> 
     <Condition Binding="{Binding Mode=OneWay, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}, Path=IsSelected}" 
        Value="True" /> 
    </MultiDataTrigger.Conditions> 
    <Setter TargetName="Border" 
      Property="Background" 
      Value="{StaticResource OnBrushSelected}" /> 
</MultiDataTrigger> 
+0

के लिए – Dessus

+0

मैं इसे एक और डब्ल्यूपीएफ मिथक कहना चाहता हूं जो किसी भी सम्मेलन का पालन नहीं करता है! – mkb

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