我有一个使用强类型DataSet
和TableAdapter
等的C#.NET项目,我有UserControl
专用于处理记录的编辑通过BindingSource
。
我想知道我是否可以绑定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?");
答案 0 :(得分:1)
绝对。虽然我发现很多细节在很多时候都非常复杂,但是WPF的一个美妙之处在于你可以将任何东西绑定到任何其他东西,只要你清楚地知道绑定意味着什么。 / p>
在您的情况下,您似乎希望将string
值作为输入(即TextBox.Text
属性的值),并根据某些属性将其绑定到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();
}
}
注意,在这里,我允许绑定传递参数,并进行简单的相等比较。但是,只要您获取string
输入并返回bool
值,您就可以自由地在此处执行任何。您可以对转换器本身的整个逻辑进行硬编码,或者您可以想出一种方法来将您的标准表示为参数并将其传递给转换器(或者当然在程序的其他地方使用某些状态,但恕我直言,如果你想自定义条件,将标准作为参数传递会更有意义。)
完成转换后,配置绑定以便它使用它是微不足道的。例如:
<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
本身。
使用上面的代码,&#34;点击我!&#34;只有当用户输入文本时才会启用按钮&#34; Hello&#34;进入TextBox
。
如果必须以不通过XAML支持的方式动态设置,您当然也可以通过编程方式执行上述所有操作。只需将相关的XAML翻译成C#代码即可。