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神话,它不遵循任何惯例!?