wpf - 条件绑定(bind)属性不起作用?

标签 wpf binding conditional-statements

我一直在为这段代码苦苦挣扎一段时间,似乎无法找到我的问题的任何完整答案。我创建了一个小样本来说明问题:

<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’ 必须具有非空值”。如果您删除使用“绑定(bind)”属性的条件,则不会引发异常。在 MSDN 文档中,它声明您必须设置 Property 或 Binding 属性。上面的代码功能,比如Binding属性没有设置。事实上,在我所有的测试用例中,将 Binding 属性设置为什么并不重要;仍然抛出异常。有什么想法吗?

最佳答案

这是你必须接受它并承认你犯了一个愚蠢的错误的时候之一。然而,为了拯救其他不幸的灵魂免于同样的命运,我会显露出我的顿悟。

首先,如果我阅读了所有文档,我会阅读如果您使用条件的“绑定(bind)”属性的部分,它需要包含在 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>

现在该示例有效,但由于所选项目已折叠,触发条件来回切换,导致所选项目闪烁进出 View 。有道理,但诚然不是我想要的。

无论如何,希望这可以帮助某人避免犯同样的愚蠢错误!

关于wpf - 条件绑定(bind)属性不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1256429/

相关文章:

r - 根据变量获取列的值和位置

haskell - 如何有条件地绑定(bind)在 do block 中?

c# - 当实体集 ChangeTracker 发生更改时如何通知 UI

c# - 回调第二次不起作用

wpf - XAML 中的 bool 命令参数

wpf - DevExpress WPF 网格使用 MVVM 绑定(bind)到 List<String>

macos - 无法在 Swift Storyboard 中设置绑定(bind)?

WPF - 当 ListView 为空时不显示上下文菜单

WPF MVVM : Notify property changed one property everytime some other property is changed

oracle - 当 Oracle 表中不存在该行时,使用 IN 条件返回该行