0

我的 WPF 网格中有以下按钮:

<Button FontSize="18" Height="32" Content="Add Module" Name="AddModuleButton" Click="AddModuleButton_Click">
    <Button.Style>
        <Style>
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=val_Name, Path=Text}" Value="{x:Static sys:String.Empty}">
                    <Setter Property="Button.IsEnabled" Value="false" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

如您所见,如果文本不为空,则启用该按钮。但我真正想要的是在文本框为空或只有空格的情况下启用它。

谁能告诉我如何在 WPF XAML 中执行此操作

4

2 回答 2

1

想到了三种方法。

  1. (视图)模型状态:在对象中有一个布尔属性并绑定它。

     public bool CanAddModule { get { return !String.IsNullOrWhiteSpace(Text); } }
     public string Text
     {
         get { return _text; }
         set
         {
             if (value != _text)
             {
                 _text = value;
                 OnPropertyChanged("Text");
                 OnPropertyChanged("CanAddModule"); // Notify dependent get-only property
             }
         }
     }
    
    <TextBox Text="{Binding Text}" .../>
    <Button IsEnabled="{Binding CanAddModule}" .../>
    
  2. 上面的扩展将绑定Button.Command,该命令内部有一个CanExecute用于此功能的命令。如果该功能为假,则被Button禁用。您需要CanExecuteChanged在函数所依赖的每个更改的属性中引发事件。

  3. 转换器:将转换器添加到绑定。

     // In converter class
     public object Convert(object value, ...)
     {
          var input = (string)value;
          return String.IsNullOrWhiteSpace(input);
     }
    
     <!--Resources-->
     <vc:IsNullOrWhiteSpaceConverter x:Key="NWSConv" />
    
     <DataTrigger Binding="{Binding Text,
                                    ElementName=val_Name,
                                    Converter={StaticResource NWSConv}}"
                  Value="false">
    
于 2012-08-22T10:19:40.040 回答
0

我想出了一个解决方案,它不是这个问题的完整答案,但可以作为我的问题的解决方案。

我在我的 TextBox 上添加了一个 TextChanged 事件:

TextBox lTextBox = (TextBox)sender;
string lCurrText = lTextBox.Text;
string lNewText = Regex.Replace(lCurrText, @"\W", "");
lTextBox.Text = lNewText;

它现在不允许空格。

于 2012-08-22T09:26:10.110 回答