gpt4 book ai didi

c# - 将控件的 Enabled 属性数据绑定(bind)到字符串字段

转载 作者:太空宇宙 更新时间:2023-11-03 13:12:08 25 4
gpt4 key购买 nike

我有一个使用强类型 DataSetTableAdapter 等的 C#.NET 项目,我有 UserControl专用于通过 BindingSource 处理记录的编辑。

我想知道是否有可能绑定(bind) TextBox 的 Enabled 属性,以根据当前记录中另一个 [string] 字段的内容动态启用或禁用它一个 BindingSource,例如如果该字段包含一个词或某个值,或者我是否应该求助于良好的旧事件处理?

一些代码(希望)说明我正在尝试什么:

//An instance of a custom StronglyTypedDataSet "ds" already exists
//with a table called "table" defined in it with at least one record.
BindingSource bs = new BindingSource(ds, "table");
bs.Position = 0;

//A TextBox txtField2 exists on the form.
//txtField2.Text is bound to the value of ds.table.Field2, and I want it to enable
//itself if the contents of ds.table.Field1 meet certain criteria.
txtField2.DataBindings.Add("Text", bs, "Field2");
txtField2.DataBindings.Add("Enabled", bs, "Field1", true, DataSourceUpdateMode.Never,
false, "WHAT GOES HERE?");

最佳答案

当然。虽然很多时候我发现很多细节非常复杂,但 WPF 的优点之一是您几乎可以将任何东西绑定(bind)到任何其他东西,只要您清楚地知道绑定(bind)的含义。

在您的情况下,您似乎想将 string 作为输入值(即 TextBox.Text 属性的值),并将其绑定(bind)到 bool基于一些已知标准的属性。

这里是您如何执行此操作的示例。首先,您需要编写从 string 转换而来的垫片到 bool .例如:

class StringToBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string text = value as string;

if (text != null)
{
string matchText = (string)parameter;

return text == matchText;
}

return Binding.DoNothing;
}

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}

注意这里,我允许绑定(bind)传递一个参数,并做一个简单的相等比较。但是你可以在这里做任何你想做的事,只要你拿着string。输入并返回一个 bool值(value)。您可以在转换器本身中对整个逻辑进行硬编码,或者您可以想出一种方法将您的标准表示为参数并以这种方式将其传递给转换器(或者当然可以在程序的其他地方使用某些状态,但恕我直言,如果您想对其进行自定义,则将标准作为参数传递更有意义。

完成转换器后,配置绑定(bind)以便它使用它就很简单了。例如:

<Window x:Class="TestSO28075399ConvertStringToBoolean.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TestSO28075399ConvertStringToBoolean"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<StackPanel.Resources>
<local:StringToBooleanConverter x:Key="stringToBooleanConverter1" />
</StackPanel.Resources>
<Border BorderBrush="Black" BorderThickness="1">
<TextBox x:Name="textBox1" />
</Border>
<Button Content="Click me!" Width="100" HorizontalAlignment="Left"
IsEnabled="{Binding ElementName=textBox1,
Path=Text,
Converter={StaticResource stringToBooleanConverter1},
ConverterParameter=Hello}" />
</StackPanel>
</Window>

当声明为资源时,转换器对象可以在资源链的任何地方。它不必在 StackPanel 中本身。

使用上面的代码,“点击我!”仅当用户在 TextBox 中准确键入文本“Hello”时,按钮才会启用。 .

如果这必须以 XAML 不支持的方式动态设置,您当然也可以通过编程方式完成上述所有操作。只需将相关的 XAML 翻译成 C# 代码中的等效项。

关于c# - 将控件的 Enabled 属性数据绑定(bind)到字符串字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28075399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com