在WPF中根据TextBox的Text属性使按钮启用/禁用?

14

我通过 Google 查找代码,以便根据文本框的文本属性启用和禁用按钮。如果文本框中有一些文本,则应启用该按钮,否则应禁用该按钮。

我找到了一些 XAML 代码但没有 C#。我无法理解它是如何工作的。

请帮助我理解以下代码的行为:

<TextBox Name="txtName" Width="100" Height="30"></TextBox>

<Button Content="Add Name " Width="100" Height="30" 
  IsEnabled="{Binding ElementName=txtName, Path=Text.Length, Mode=OneWay}"/>

IsEnabled按钮属性如何工作?true和false如何设置为IsEnabled属性?什么是Path?它是如何工作的?

6个回答

8
这个文章文章解释了WPF数据绑定以及路径如何工作。
但是上面的绑定将监视TextBox上的Text属性的更改。然后它将观察从Text属性返回的值的Length属性,该值是一个字符串。 Length属性的值传递给IsEnbled属性。
还必须转换该值,因为您正在将Int32(Length属性)分配给Boolean(IsEnabled属性)。这通常通过类型转换器完成,这就是为什么上述内容有效(这让我感到惊讶)。
更新:
上面的第一个链接不再有效,因为早于2008年的MSDN杂志文章不再在线提供。但是它们作为CHM文件提供。关联文章的CHM链接标题为“Data Points:Data Binding in WPF”,如下所示: http://download.microsoft.com/download/3/a/7/3a7fa450-1f33-41f7-9e6d-3aa95b5a6aea/MSDNMagazine2007_12en-us.chm 来自MSDN:
2008年及更早版本仅可用作.chm文件。在大多数Windows版本上,您必须先将这些文件保存到本地计算机,然后取消阻止文件以读取它。要取消阻止文件,请右键单击该文件,然后选择属性,然后选择“取消阻止”按钮。然后内容将可供阅读。

1
0 被转换为 false,所有 >=1 的值被转换为 true,非常有趣。 - H.B.
1
@H.B. - 看起来整数类型转换器可以做到(Int32Converter),但布尔类型转换器不行。所以它一定是在使用整数转换器。 - CodeNaked
1
顺便我也会包含一个链接到数据绑定概述,因为它更全面,而且提问者是初学者。 - H.B.
引用的文章似乎不再可用。 - Ondrej Janacek
奇怪。看来他们现在没有早期版本的 MSDN 杂志可用:http://blogs.msdn.com/b/msdnmagazine/archive/2007/11/16/6310398.aspx - CodeNaked
显示剩余5条评论

3

请参考 此帖子,了解如何根据TextBox内容禁用Button的示例。

虽然这种方法可以运作,但最好使用ICommand进行操作。

针对评论的回应

ElementName = XAML中要绑定的控件的名称。因此,下面的示例将是{Binding ElementName=aName}

<TextBox x:Name="aName" />

Path = 属性路径,表示要获取该元素上的值。例如,如果要获取Text属性的值,则应使用{Binding Path=Text}。如果要获取Text属性的长度,则使用{Binding Path.Text.Length}等。

Mode=OneWay = 绑定所评估的方向。更多信息请参见此处


能否请您解释一下绑定是如何工作的... IsEnabled="{Binding ElementName=txtName, Path=Text, Mode=OneWay}"。我们必须始终提及Binding ElementName和Path吗?Mode是什么以及它是如何工作的?麻烦请解释一下。 - Mou

1
在您的视图模型中添加一个属性来计算IsEnabled的值,并将其绑定到该属性。在您将TextBox.Text值绑定到的属性的setter中,还触发IsEnabled属性的更改事件。

1

如果您不想使用MVVM/数据绑定,您可以:

  1. 您可以向TextBox的样式添加DataTrigger,并在那里禁用/启用按钮。

  2. 或将Button的IsEnabled属性绑定到TextBox的Text属性,并使用值转换器将字符串长度转换为布尔值。


1
这是WPF(xaml)中的新绑定语法。
1. 你正在绑定到txtName文本框控件/元素。 2. 使用Path来指定要绑定到的元素的属性。在这种情况下,你正在绑定到TextBox的Text属性,然后是Text的Length属性。
所以,当文本框为空时,TextBox.Text.Length = 0,这意味着它将被禁用。
一旦输入任何值,它就会变成>= 0,这会被转换为true。
我强烈建议在编码之前先阅读关于WPF绑定的内容。它与WinForm相比有很大的不同。

能否请您解释一下这里的绑定是如何工作的?IsEnabled="{Binding ElementName=txtName, Path=Text, Mode=OneWay}。我们必须始终提及Binding ElementName和path,这是强制性的。什么是mode以及它是如何工作的,请解释一下。 - Mou

0
如果您的文本框 x:Name="txtName"<Button x:Name="buttonName" IsEnabled="{Binding Text.Length, ElementName=txtName}"/>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接