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

Posted

技术标签:

【中文标题】根据WPF中的TextBox Text属性启用/禁用按钮?【英文标题】:Make Button enabled/disabled depending on the TextBox Text property in WPF? 【发布时间】:2011-09-22 00:40:24 【问题描述】:

我正在通过 google 寻找代码,该代码根据文本框中的 text 属性启用和禁用按钮。如果文本框有一些文本,则应启用按钮,否则应禁用按钮。

我得到了一些代码,但是 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 按钮属性如何工作? IsEnabled 属性如何设置 true 和 false?什么是路径?它是如何工作的?

【问题讨论】:

【参考方案1】:

article 和 article 解释了 WPF 数据绑定以及路径的工作原理。

但是上面的绑定会观察 TextBox 上的 Text 属性的变化。然后它将观察从 Text 属性返回的值的 Length 属性,该值是一个字符串。 Length 属性的值被传递给 IsEnbled 属性。

该值也必须转换,因为您将 Int32(长度属性)分配给布尔值(IsEnabled 属性)。这通常是通过类型转换器完成的,这就是上述工作的原因(这让我感到惊讶)。

更新:

上面的第一个链接不再有效,因为 2008 年以前的 MSDN 杂志文章不再在线提供。虽然它们可以作为 CHM 文件使用。标题为“数据点:WPF 中的数据绑定”的相关文章的 CHM 链接是:

http://download.microsoft.com/download/3/a/7/3a7fa450-1f33-41f7-9e6d-3aa95b5a6aea/MSDNMagazine2007_12en-us.chm

来自 MSDN:

2008 年及更早的问题仅以 .chm 文件的形式提供。在大多数版本的 Windows 上,您必须首先将这些文件保存到本地计算机,然后解除阻止文件才能读取它。要取消阻止文件,请右键单击它,然后选择属性,然后选择“取消阻止”按钮。内容将可供阅读。

【讨论】:

0转为false,一切>=1转为true,挺有意思的。 @H.B. - 是的,我想,只是想知道转换是什么:-) 因为bool b = 0; 无效。也许是绑定本身? @CodeNaked:绑定系统使用了一些类,它们继承自TypeConverter @H.B. - 看起来整数类型转换器可以做到(Int32Converter),但布尔类型转换器不行。所以它必须使用 int 转换器。 顺便说一下,我还会附上一个指向Data Binding Overview 的链接,因为它更完整,而且提问者是初学者。【参考方案2】:

有关如何根据 TextBox 内容禁用 Button 的示例,请参阅 this post。

虽然这种方法可行,但最好使用ICommand

回应cmets

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

<TextBox x:Name="aName" />

Path = 您想要在该元素上的值的属性路径。例如,如果您想获取 Text 属性的值,您可以使用 Binding Path=Text。如果要获取 Text 属性的长度,可以使用Binding Path.Text.Length 等等。

Mode=OneWay = 评估绑定的方向。这是解释here

【讨论】:

你能解释一下绑定是如何工作的吗...IsEnabled="Binding ElementName=txtName, Path=Text, Mode=OneWay。我们总是需要提到绑定元素名和路径是强制性的。什么是模式以及它是如何工作的。请解释一下【参考方案3】:

向您的视图模型添加一个属性,该属性计算 IsEnabled 的值并绑定到该值。

在您已将 TextBox.Text 值绑定到的属性的设置器中,还会触发 IsEnabled 属性的更改事件。

【讨论】:

【参考方案4】:

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

    您可以将 DataTrigger 添加到 TextBox 的样式中并在其中禁用/启用按钮。

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

【讨论】:

【参考方案5】:

这是 WPF (xaml) 中新的绑定语法。

    您正在绑定到 txtName TextBox 控件/元素 您使用Path 指定您尝试绑定到的元素的哪个属性。在这种情况下,您将绑定到 TextBox 的 Text 属性,然后绑定到 Text 的 Length 属性。

所以,当文本框为空时。 TextBox.Text.Length = 0 这意味着它将被禁用。

只要您输入任何值,它就会变成 >= 0,然后转换为 true。

我强烈建议在尝试编码之前阅读有关 WPF 中的绑定的信息。 WPF 和 WinForm 完全不同

【讨论】:

你能解释一下绑定是如何工作的吗...IsEnabled="Binding ElementName=txtName, Path=Text, Mode=OneWay。我们总是需要提到绑定元素名和路径是强制性的。什么是模式以及它是如何工作的。请解释一下。

以上是关于根据WPF中的TextBox Text属性启用/禁用按钮?的主要内容,如果未能解决你的问题,请参考以下文章

wpf怎么给textbox的text属性指定默认值

WPF 怎么设置comboBox.text

WPF 在代码隐藏中设置 TextBox 属性

wpf中textbox的Text属性因为Style的绑定,导致输入的数值始终是原来的数值,是怎么回事

WPF中的TextBox一些问题

基于 TextBox 值 (WPF) 启用按钮