2009-08-10 89 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設置,當鼠標不再在選定的項目所選項目應重新出現。但是,此代碼會生成一個InvalidOperationException異常,並顯示消息「必須對'Property'具有非空值。」如果刪除使用「綁定」屬性的條件,則不會引發異常。在MSDN文檔中,它聲明您必須設置屬性或綁定屬性。上述代碼功能像Binding屬性沒有設置。實際上,在我的所有測試用例中,綁定屬性設置爲什麼並不重要;異常仍然拋出。有什麼想法嗎?

回答

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並提供解決方案。其他人會遇到這種情況。缺少「數據」一詞很容易忽略。 – 2009-08-11 03:08:06

+3

+1讓我更快地找到解決方案,而不是通過文檔查找和閱讀。錯誤應該解釋這個,而不是依靠文檔。 – jpierson 2010-09-09 18:01:29

+1

+1剛剛做出了同樣的骨頭移動。你的帖子可能爲我節省了一個小時。 – 2011-03-15 15:08:21

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

這幫了我,謝謝。 +1 – Dessus 2011-12-18 01:26:36

+0

我想調用這個不遵循任何約定的另一個WPF神話!? – mkb 2015-10-20 10:36:25