WPF数据触发器未按预期触发

31

我有以下 XAML 代码:

<TextBlock Text="{Binding ElementName=EditListBox, Path=SelectedItems.Count}" Margin="0,0,5,0"/>
<TextBlock Text="items selected">
    <TextBlock.Style>
        <Style TargetType="{x:Type TextBlock}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=EditListBox, Path=SelectedItems.Count}" Value="1">
                    <Setter Property="TextBlock.Text" Value="item selected"></Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>

第一个文本块随着SelectedItems.Count的变化快乐地改变,显示0,1,2等等。 第二个文本块上的数据触发器似乎从未触发以更改文本。

有什么想法吗?


1
你知道吗,我不知道为什么这个问题总是被踩 - 它是一个合法的问题。如果你要踩,至少留下一个评论说明原因。 - 17 of 26
1
这很奇怪,我给你点赞了。 - viggity
这个标题可能有点含糊,但这是DataTriggers的一个常见问题,这是一个很好的例子,+1。 - Robert Macnee
谢谢,我尝试更新标题使其更明确。 - 17 of 26
2个回答

29

或者,您可以用以下代码替换您的XAML:

<TextBlock Margin="0,0,5,0" Text="{Binding ElementName=EditListBox, Path=SelectedItems.Count}"/>
<TextBlock>
    <TextBlock.Style>
        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="Text" Value="items selected"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=EditListBox, Path=SelectedItems.Count}" Value="1">
                    <Setter Property="Text" Value="item selected"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>

转换器可以解决很多绑定问题,但是拥有很多专业的转换器会变得非常混乱。


谢谢,一个简单的解决方案来应对一个非常愚蠢的限制/设计缺陷/微软带来的烦恼。 - Xtr

13

数据触发器正在触发,但是第二个TextBlock的文本字段硬编码为"items selected",因此它将无法更改。要查看其触发,请删除Text="items selected"。

你的问题很适合使用值转换器(ValueConverter)而不是数据触发器(DataTrigger)。以下是创建和使用ValueConverter以设置所需文本的方法。

创建此ValueConverter:

public class CountToSelectedTextConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if ((int)value == 1)
            return "item selected";
        else
            return "items selected";
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}

将命名空间引用添加到包含转换器的程序集中:

xmlns:local="clr-namespace:ValueConverterExample"

将转换器添加到您的资源中:

<Window.Resources>
    <local:CountToSelectedTextConverter x:Key="CountToSelectedTextConverter"/>
</Window.Resources>

将您的第二个文本块更改为:

    <TextBlock Text="{Binding ElementName=EditListBox, Path=SelectedItems.Count, Converter={StaticResource CountToSelectedTextConverter}}"/>

你说得对,移除文本就可以了。我会选择“item(s) selected for text”,因为我不想为此创建整个转换器。然而,我将把这个答案标记为已接受的,因为它也可以工作。 - 17 of 26
3
如果您需要使用数据触发器来控制故事板,那么转换器在这种情况下就不合适了。有什么建议吗? - Gusdor

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