Wpf 条件绑定属性不工作?

Wpf 条件绑定属性不工作?,wpf,binding,conditional-statements,Wpf,Binding,Conditional Statements,我已经为这段代码挣扎了一段时间,似乎找不到任何完整的答案来回答我的问题。我创建了一个小示例来说明这个问题: <ListView > <ListView.ItemsPanel> <ItemsPanelTemplate> <StackPanel Margin="0,0,20,0" IsItemsHost="True" /> </ItemsPanelTemplate> </List

我已经为这段代码挣扎了一段时间,似乎找不到任何完整的答案来回答我的问题。我创建了一个小示例来说明这个问题:

<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>

测试1
测试2
测试3
测试4
测试5

根据MultiTrigger设置,当鼠标不再位于所选项目上方时,所选项目应重新出现。但是,此代码生成一个InvalidOperationException,消息为“必须具有'Property'的非null值”。如果删除使用“Binding”属性的条件,则不会引发异常。在MSDN文档中,它声明必须设置Property或Binding属性。上面的代码没有设置绑定属性等功能。事实上,在我所有的测试用例中,绑定属性设置为什么并不重要;异常仍然被抛出。有什么想法吗?

这是一个你不得不承认自己犯了愚蠢错误的时刻。然而,为了拯救其他不幸的灵魂免于同样的命运,我将展示我的顿悟

首先,如果我已经阅读了所有的文档,我会阅读其中的部分,其中提到如果使用条件的“Binding”属性,那么它需要包含在MultiDataTrigger元素中(而不是我发布的示例中的multitrigger元素)

其次,在进行这些更改后,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>

现在该示例起作用了,但由于选定项目已折叠,因此触发器条件会来回切换,导致选定项目在视图中来回闪烁。有道理,但不可否认,这不是我的本意


无论如何,希望这能帮助别人避免犯同样愚蠢的错误

在一个非常类似的注释中,从一个边框中提取IsMouseOver作为主要数据模板内容,并从祖先中提取IsSelected。有趣的是,这两个条件都必须有一个相对路径,我假设默认路径是本地datacontext。感谢您提供上述解决方案

破译的代码

<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>


+1,用于承认愚蠢并提供解决方案。其他人会遇到这种情况。缺少“数据”一词很容易被忽略。+1比实际查找和阅读文档更快地引导我找到解决方案。这个错误应该解释这一点,而不是依赖文档。+1只是做出了同样的愚蠢举动。你的帖子可能帮我节省了一个小时。我想把这称为另一个WPF神话,它不遵循任何惯例!?