根据文本框的值启用/禁用按钮

本文关键字:按钮 启用 文本 | 更新日期: 2023-09-27 18:19:55

我在MainWindow中有一个文本框。

<TextBox Name="txtCalls" Text="{Binding ElementName=sliderCalls,
            Path=Value,UpdateSourceTrigger=PropertyChanged}" DockPanel.Dock="Right" Width="22"/>

我还有两个按钮:btnStartbtnAbort

<Button x:Name="btnStart" Margin="5,12,5,0.2" Content="Start Test" Width="78" DockPanel.Dock="Left"
            Click="btnStart_Click"  VerticalContentAlignment="Center"/>
<Button  x:Name="btnAbort" Content="Abort Test" Width="76" DockPanel.Dock="Right"
            IsEnabled="False" Click="btnAbort_Click" VerticalContentAlignment="Center" Margin="0,12,0,0.2"/>

我想要的是通过文本框txtCalls的值来"启用"或"禁用"按钮。假设我们有这样的逻辑:

if (txtCalls.Text == "")
{
    btnStart.IsEnabled = false;
    btnAbort.IsEnabled = true;
}
else
{
    btnStart.IsEnabled = true;
    btnAbort.IsEnabled = false;
}

顺便说一下,我确实有一门课:

public class NotifyUIBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

但它被另一个combobox控件public class Combox : NotifyUIBase 使用

在这种情况下,我不知道如何应用文本框NotifyPropertyChanged。

根据文本框的值启用/禁用按钮

如果其他人在寻找启用按钮时偶然发现了这个答案,Maximus的答案会容易得多。这是一种更加注重MVVM的处理方式。

所以我知道这里的名字是令人向往的,但它们确实在做简单的事情。两个按钮IsEnabled属性都绑定到处理文本框的Text值。然后,转换器接收该值,将其与目标字符串进行检查,然后返回一个值,指示是否应启用该按钮。为此,它们可以很容易地被命名为"IfValueIsProcessingTheTrueConverter"或类似的名称,但这似乎也很混乱。

主窗口.xaml

<Window x:Class="WpfPlayground.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:wpfPlayground="clr-namespace:WpfPlayground"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <wpfPlayground:CanStartConverter x:Key="CanStartConverter" />
        <wpfPlayground:CanAbortConverter x:Key="CanAbortConverter" />
    </Window.Resources>
    <StackPanel>
        <Button x:Name="btnStart" Margin="5,12,5,0.2" Content="Start Test" Width="78" DockPanel.Dock="Left" 
        IsEnabled="{Binding ElementName=txtCalls, Path=Text, Converter={StaticResource CanStartConverter}}"
        Click="btnStart_Click"  VerticalContentAlignment="Center"/>
        <Button  x:Name="btnAbort" Content="Abort Test" Width="76" DockPanel.Dock="Right"
         IsEnabled="{Binding ElementName=txtCalls, Path=Text, Converter={StaticResource CanAbortConverter}}" Click="btnAbort_Click" VerticalContentAlignment="Center" Margin="0,12,0,0.2"/>
        <TextBox HorizontalAlignment="Left" Height="23" TextWrapping="Wrap" Text="{Binding ElementName=sliderCalls,
        Path=Value,UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="120" Name="ProcessingTextBox"/>
    </StackPanel>
</Window>

CanStartConverter.cs

using System;
using System.Globalization;
using System.Windows.Data;
namespace WpfPlayground
{
    public class CanStartConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value.ToString() != "")
            {
                return true;
            }
            return false;
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return Binding.DoNothing;
        }
    }
}

CanAbortConverter.cs

using System;
using System.Globalization;
using System.Windows.Data;
namespace WpfPlayground
{
    public class CanAbortConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value.ToString() == "")
            {
                return true;
            }
            return false;
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return Binding.DoNothing;
        }
    }
}
   <TextBox Name="txtCalls"/>
    <Button Content="Start">
        <Button.Style>
            <Style TargetType="Button">
                <Setter Property="IsEnabled" Value="True"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=txtCalls, Path=Text.Length}" Value="0">
                        <Setter Property="IsEnabled" Value="False"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>
    <Button Content="Abort">
        <Button.Style>
            <Style TargetType="Button">
                <Setter Property="IsEnabled" Value="False"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=txtCalls,Path=Text.Length}" Value="0">
                        <Setter Property="IsEnabled" Value="True"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>

或者使用这个

<DataTrigger Binding="{Binding ElementName=txtCalls, Path=Text}" Value="{x:Static sys:String.Empty}">
                            <Setter Property="IsEnabled" Value="False"/>