多数据触发器与绑定路径条件无法正常工作

3

我已经实现了一个WPF用户控件,我想在主网格上鼠标悬停时隐藏一些堆栈面板。而且我需要有多个触发条件。尽管我到处查找,但我无法找到我做错了什么。用户控件资源如下:

<UserControl.Resources>
    <Style x:Key="StackViewStyle" TargetType="{x:Type StackPanel}">
        <Style.Triggers>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding RelativeSource={RelativeSource AncestorType=Grid},Path=IsMouseOver}" Value="True" />
                    <Condition Binding="{Binding Path=FileState, RelativeSource={RelativeSource Self}}" Value="Uploading" />
                </MultiDataTrigger.Conditions>
                <Setter Property="Visibility" Value="Collapsed"/>
            </MultiDataTrigger>
        </Style.Triggers>
    </Style>
</UserControl.Resources>

数据绑定很好,因为当我添加一个测试标签来检查它的值时,它显示为“上传中”。如果我移除FileState条件语句,它就开始工作了。我正在使用以下代码:
<StackPanel Name="StackViewCount" Style="{StaticResource StackViewStyle}">
    ...
</StackPanel>

在查看输出窗口时,我发现了这个错误:

BindingExpression路径错误:在“对象”“'StackPanel'(名称='StackViewCount')”上未找到“FileState”属性。 BindingExpression: Path = FileState; DataItem ='StackPanel'(名称='StackViewCount');目标元素为'StackPanel'(名称='StackViewCount');目标属性为'NoTarget'(类型为'Object')

那么我该如何让绑定在用户控件中查找FileState而不是StackPanel呢?

现在,当我将条件更改为

<Condition Binding="{Binding Path=FileState}" Value="Uploading" />

我没有看到任何错误,但仍然无法工作。

FileState是StackPanel的一个属性吗? - D J
不,它是UserControl的属性。@DJ我觉得我在这里错过了重点,我如何使用UserControl绑定。因为我已经尝试过 "{Binding Path=FileState}"。 - Mirza Bilal
FileState 是说 uploading 还是 Uploading?请注意大小写。同时,请检查输出窗口是否有错误信息。 - Arian Motamedi
显然我知道大小写敏感在这里很重要。你提出的第二件事,给我一个提示,因为它正在搜索堆栈面板中的FileState,而这不是堆栈面板本身,而是父用户控件的。 - Mirza Bilal
1个回答

3

由于FileState是您的UserControl的属性,而且它是StackPanel的祖先,因此您需要像这样绑定到祖先

<Condition Binding="{Binding Path=FileState, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" Value="Uploading" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接