如何在TextBox.Triggers(事件触发器)上执行一些操作

本文关键字:执行 操作 触发器 事件 TextBox Triggers | 更新日期: 2023-09-27 18:21:15

我必须禁用一个some按钮。

如何使用TextBox.Triggers

有样品吗?

感谢您的回复!

如何在TextBox.Triggers(事件触发器)上执行一些操作

我假设这与您的另一个问题有关,即根据TextBox是否存在验证错误来触发Button上的Enabled属性。

如果是这样,您将使用DataTrigger来测试TextBox.Validation.HasError属性,看看它是否有任何错误,如果有,则禁用Button

<Style x:Key="MyButtonStyle" TargetType="{x:Type Button}">
    <Setter Property="IsEnabled" Value="True" />
    <DataTrigger Binding="{Binding ElementName=MyTextBox, Path=Validation.HasError" Value="True">
        <Setter Property="IsEnabled" Value="False"/>
    </DataTrigger>
</Style>

确保您将TextBox与ValidatesOnDataErrors="True"绑定,以便工作

<TextBox x:Name="MyTextBox" Text="{Binding SomeText, ValidatesOnDataErrors=True }" />

顺便说一句,我对你的另一个问题的评论仍然适用于此。我个人会在您的ViewModel中实现IDataErrorInfo,并使SaveCommand.CanExecute()仅在ViewModel.IsValid时返回true。然后,如果SaveCommand不应该执行

,它将自动处理禁用按钮

假设您有一个TextBox和一个Button,并且您希望在TextBox为空时禁用您的Button。这可以通过DataTriggers:轻松实现

<TextBox x:Name="textBox" />
<Button>
    <Button.Style>
        <Style>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Text, ElementName=textBox}" Value="">
                    <Setter Property="Button.IsEnabled" Value="False" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

尽管发布代码示例会很有帮助,并且会提供更好的解决方案,但我仍然可以推荐数据绑定。类似的东西

<Button Name="btnFoo"
        Enabled="{Binding ElementName=txtblkBar, Converter={StaticResource ButtonVisibilityConverter}"/>

控件的资源部分包含

<local:ButtonVisibilityConverter Name="ButtonVisibilityConverter"/>

并且您已经在local引用的命名空间中定义了一个类CCD_ 14。我链接到上面的页面的数据转换部分有一个转换器类的示例。

编辑:

每当txtblkBar为空时将按钮设置为禁用的代码:

[ValueConversion(typeof(TextBlock), typeof(bool?))]
public class ButtonVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        TextBlock txtblk = value as TextBlock;
        if (null == txtblk)
            return false;
        return !string.IsNullOrEmpty(txtblk.Text);
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        // Don't need to use the back conversion
        throw new NotImplementedException();
    }
}