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

时间:2012-01-23 19:28:17

标签: c# wpf xaml

我必须禁用某个按钮。

我如何使用 TextBox.Triggers

有样品吗?

感谢您的回复!

3 个答案:

答案 0 :(得分:4)

我假设这与your other question有关,根据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 }" />

作为旁注,我对您的其他问题的评论仍然适用于此。我会亲自在IDataErrorInfo中实施ViewModel,并使SaveCommand.CanExecute()仅在ViewModel.IsValid时返回true。然后,如果SaveCommand不应该执行

,它将自动关闭禁用按钮

答案 1 :(得分:3)

假设您有TextBoxButton,并且想要在Button为空时禁用TextBox。这可以通过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>

答案 2 :(得分:0)

虽然发布代码示例会有所帮助并且可以提供更好的解决方案,但我仍然可以推荐data binding。像

这样的东西
<Button Name="btnFoo"
        Enabled="{Binding ElementName=txtblkBar, Converter={StaticResource ButtonVisibilityConverter}"/>

控件的资源部分包含

<local:ButtonVisibilityConverter Name="ButtonVisibilityConverter"/>

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

修改

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();
    }
}