"/>

WPF Datatrigger不会在预期时触发

WPF Datatrigger不会在预期时触发

WPF Datatrigger not firing when expected

我有以下XAML:

1
2
3
4
5
6
7
8
9
10
11
12
<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等。第二个块上的数据触发似乎永远不会触发来更改文本。

有什么想法吗?


或者,您可以将XAML替换为:

1
2
3
4
5
6
7
8
9
10
11
12
13
<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>

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


正在触发DataTrigger,但是第二个TextBlock的"文本"字段被硬编码为"所选项目",因此将无法更改。要查看其触发情况,可以删除Text = " selected items "。

您的问题非常适合使用ValueConverter而不是DataTrigger。这是创建和使用ValueConverter使其设置为所需文本的方法。

创建此ValueConverter:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
}

将名称空间引用添加到转换器所在的程序集中:

1
xmlns:local="clr-namespace:ValueConverterExample"

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

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

将第二个文本块更改为:

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

推荐阅读

    linux不显示命令输出?

    linux不显示命令输出?,系统,情况,异常,信息,工具,百度,不了,工作,代码,命令,l

    linux命令行显示乱码?

    linux命令行显示乱码?,系统,情况,乱码,中文,字符集,服务器,原因,字符,日志,

    linux虚拟机文本命令?

    linux虚拟机文本命令?,系统,工作,名字,代码,命令,文件,信息,第一,数据,名称,L

    linux命令显示内存?

    linux命令显示内存?,系统,情况,电脑,分析,状态,工具,信息,命令,内存,实时,查

    linux换行显示命令?

    linux换行显示命令?,系统,命令,地址,工作,文件,实时,标准,管理,基础,目录,30

    linux关闭文本命令?

    linux关闭文本命令?,系统,工作,状态,信息,地址,电脑,命令,工具,基础,管理,lin

    linux显示操作命令?

    linux显示操作命令?,系统,工作,地址,信息,管理,命令,目录,基础,工具,标准,lin

    linux命令行显示天气?

    linux命令行显示天气?,信息,系统,城市,手机,情况,时间,实时,地址,工作,标准,l

    linux命令显示帐号?

    linux命令显示帐号?,系统,信息,密码,时间,地址,命令,网络,用户,名称,管理,Lin

    linux命令行显示路径?

    linux命令行显示路径?,系统,数据,信息,命令,工作,时间,标准,文件,目录,名称,l

    linux显示详细命令?

    linux显示详细命令?,工作,系统,信息,地址,命令,标准,数据,目录,文件,名称,执

    linux显示上一个命令?

    linux显示上一个命令?,信息,机器人,人工智能,第一,地方,工具,在线,网站,代

    linux满屏显示命令?

    linux满屏显示命令?,工具,系统,服务,电脑,网络,技术,信息,数据,上会,软件,如

    显示linux时间命令?

    显示linux时间命令?,时间,系统,信息,一致,命令,文件,终端,目录,选项,参数,lin

    linux常用命令文本?

    linux常用命令文本?,工作,命令,网络,地址,系统,管理,标准,信息,目录,文件,Lin

    linux命令刷新显示?

    linux命令刷新显示?,系统,工作,最新,地址,命令,异常,分析,工具,信息,软件,Lin

    linux显示最多的命令?

    linux显示最多的命令?,系统,情况,信息,数据,工具,电脑,状态,时间,分析,命令,

    linux命令高亮显示?

    linux命令高亮显示?,系统,信息,命令,电脑,地址,代码,情况,分析,位置,文件,Lin

    linux显示隐藏命令?

    linux显示隐藏命令?,系统,电脑,档案,工具,一致,生产,文件夹,文件,命令,开头,l

    linux显示错误命令?

    linux显示错误命令?,信息,系统,电脑,状态,时间,环境,命令,搜狐,密码,异常,虚