如何编写DataTrigger来更新WPF TextBox中Tag属性的值?

时间:2015-12-15 13:51:19

标签: c# wpf xaml datatrigger

我需要编写 DataTrigger 来更新WPF TextBox中标记属性的值。

如果TextBox Text.Count >0然后将Tag属性更新为True,则为False

XAML Source Code:
<TextBox Text="WPF"  Tag="True">
    <TextBox.Triggers>
        <DataTrigger Property="Text" Value="0">
            <Setter Property="Tag" Value="False" />
        </DataTrigger>
    </TextBox.Triggers>
</TextBox>

4 个答案:

答案 0 :(得分:4)

您的代码无效,因为您无法将数据触发器放入控件的Triggers集合中。您实际需要的是控件Style中的触发器。

请改为尝试:

<TextBox Text="WPF" Tag="True">
    <TextBox.Style>
        <Style TargetType="{x:Type TextBox}">
            <Style.Triggers>
                <DataTrigger Value="0"
                    Binding="{Binding Text.Length, RelativeSource={RelativeSource Self}}">
                    <Setter Property="Tag" Value="False" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBox.Style>
</TextBox>

请注意,这不是万无一失的:如果文本框仅包含空格,那么它可能看起来是空的,但文本的长度将大于零。

正如user2946329和ATM的答案所示,在<Style>触发器中有多种方法可以做到这一点。

答案 1 :(得分:2)

DataTrigger没有财产。你应该像这样使用Property trigger

<TextBox Text="WPF" Tag="True">
    <TextBox.Style>
        <Style TargetType="TextBox">
            <Style.Triggers>
                <Trigger Property="Text" Value="0">
                    <Setter Property="Tag" Value="False" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </TextBox.Style>
</TextBox>

或者,如果您想根据文字长度更改Tag,请尝试以下操作:

<Trigger Property="Text" Value="">

答案 2 :(得分:2)

我使用过StevenRands的答案并改编自己:

在此示例中,如果Text为null或为空,则Tag将为false。

<StackPanel>
    <TextBox Text="WPF" Name="tb">
        <TextBox.Style>
            <Style TargetType="{x:Type TextBox}">
                <Setter Property="Tag" Value="True"/>
                <Style.Triggers>
                    <DataTrigger Value="" Binding="{Binding Text, RelativeSource={RelativeSource Self}}">
                        <Setter Property="Tag" Value="False" />
                    </DataTrigger>
                    <DataTrigger Value="{x:Null}" Binding="{Binding Text, RelativeSource={RelativeSource Self}}">
                        <Setter Property="Tag" Value="False" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </TextBox.Style>
    </TextBox>

    <!-- YOU CAN CHECK THE TAG'S VALUE HERE-->
    <TextBlock Text="{Binding ElementName=tb, Path=Tag}"/>
</StackPanel>

这里的StevenRands更好地回答了一些改变以使其发挥作用:

<TextBox Text="WPF">
        <TextBox.Style>
            <Style TargetType="{x:Type TextBox}">
                <Setter Property="Tag" Value="True"/>
                <Style.Triggers>
                    <DataTrigger Value="0" Binding="{Binding Text.Length, RelativeSource={RelativeSource Self}}">
                        <Setter Property="Tag" Value="False" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </TextBox.Style>
    </TextBox>

答案 3 :(得分:0)

你必须做类似的事情:

在这里,我描述了一种风格并将其附加到控件上。

 <Style TargetType="telerik:BarIndicator" x:Key="Percent">
            <Style.Resources>
                <vc:LoadPercentValueConverter x:Key="LPValueConverter"/>
            </Style.Resources>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=myEngine.PercentLoaded, Converter={StaticResource LPValueConverter}}" Value="1" >
                    <Setter Property="Background" Value="Red"></Setter>
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=myEngine.PercentLoaded, Converter={StaticResource LPValueConverter}}" Value="0" >
                    <Setter Property="Background" Value="Green"></Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>

以下是控件:

<telerik:BarIndicator Style="{StaticResource Percent}" Visibility="{Binding WhileLoading}" Value="{Binding Path=myEngine.PercentLoaded}" StartWidth="0.13"/>

您必须使用值转换器。这是我的。

class LoadPercentValueConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            long percent = (long)System.Convert.ChangeType(value, typeof(long));
            if (percent > 80)
            {
                return 1;
            }

            else
            {
                return 0;
            }
        }

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