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の設定によると、選択した項目が再び表示されないはずです。ただし、このコードでは、InvalidOperationExceptionが生成されます。「 'Property'にはnull以外の値が必要です」というメッセージが表示されます。 "Binding"属性を使用するConditionを削除すると例外はスローされません。 MSDNドキュメントでは、プロパティまたはバインディング属性のいずれかを設定する必要があることを示しています。上記のコードは、Binding属性が設定されていないような機能です。実際、すべてのテストケースでは、Binding属性がどのように設定されているかは関係ありません。例外はスローされます。何かご意見は?

答えて

52

これは、あなたがそれを吸い取る必要があり、あなたが骨頭ミスをしたことを認めなければならない時の1つです。しかし、他の不運な魂を同じ運命から救うために、私は自分の出世を明らかにするでしょう。

まず、私は私はあなたが条件の「結合」属性を使用している場合、それは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。他の人がこれに逆らって走ります。 "データ"という言葉が見当たりません。 –

+3

+1実際に狩りをしてドキュメントを読むよりもはるかに速く私を解決するために。エラーは、ドキュメントに頼る代わりにこれを説明していたはずです。 – jpierson

+1

+1ちょうど同じ骨頭の動きをしました。あなたの投稿はおそらく私を1時間節約しました。 –

3

非常に似たように、メインデータテンプレートのコンテンツとして境界からIsMouseOverを引き出し、祖先からIsSelectedを引き出します。両方の条件が相対パスを持たなければならないという興味深いことは、デフォルトのパスはローカルのdatacontextであると仮定します。上記のソリューションに感謝します。

boneheadednessを認め、ソリューションを提供するために壊れたコード

<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

+0

私はこの慣習に従わない別のWPF神話を呼びたいと思っています! – mkb

関連する問題