【问题标题】:Condition Binding Attribute Not Working?条件绑定属性不起作用?
【发布时间】:2010-11-18 09:23:16
【问题描述】:

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

<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 文档中,它声明您必须设置 Property 或 Binding 属性。上面的代码功能,比如Binding属性没有设置。事实上,在我所有的测试用例中,将 Binding 属性设置为什么并不重要;仍然抛出异常。有什么想法吗?

【问题讨论】:

    标签: wpf binding conditional-statements


    【解决方案1】:

    在一个非常相似的注释中,从边框中拉出 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>
    

    【讨论】:

    • 我想称之为另一个不遵循任何约定的 WPF 神话!?
    【解决方案2】:

    这是你不得不接受并承认你犯了一个愚蠢的错误的时候之一。但是,为了让其他不幸的灵魂免于同样的命运,我会显明我的顿悟。

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

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

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

    【讨论】:

    • +1 承认愚蠢并提供解决方案。其他人会反对这一点。缺少“数据”这个词很容易被忽视。
    • +1 比实际搜索和阅读文档更快地引导我找到解决方案。错误应该解释这一点,而不是依赖文档。
    • +1 刚刚做出了同样愚蠢的举动。你的帖子可能为我节省了一个小时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多