【发布时间】:2014-06-23 08:38:50
【问题描述】:
我是 WPF 新手,在网上找不到解决方案。我的问题是我希望我的按钮只有在四个文本框没有有效性错误时才启用。 我的代码是:
<Button Content="Action" Click="Action_Click" >
<Button.IsEnabled>
<MultiBinding Converter="{StaticResource ValCon}">
<Binding ElementName="textBox1" />
<Binding ElementName="textBox2"/>
<Binding ElementName="textBox3"/>
<Binding ElementName="textBox4"/>
</MultiBinding>
</Button.IsEnabled>
</Button>
我的多值转换器是这样的:
class ValidityConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
bool b = true;
foreach (var x in values)
{
TextBox y = x as TextBox;
if (Validation.GetHasError(y))
{
b = false;
break;
}
}
return b;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
我注意到这仅在开始时有效。当用户修改其中一个文本框时,它不会。我的价值转换器是否需要实施 INotifyPropertyChange?在 WPF 中做这样的事情的正确解决方案是什么?感谢您的帮助。
编辑
我已经做过这样的事情并且它正在工作:
<Button Click="Button_Click" >
<Button.Style>
<Style TargetType="Button">
<Setter Property="IsEnabled" Value="False"/>
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=(Validation.HasError), ElementName=textBox}" Value="False"/>
<Condition Binding="{Binding Path=(Validation.HasError), ElementName=textBox1}" Value="False"/>
<Condition Binding="{Binding Path=(Validation.HasError), ElementName=textBox2}" Value="False"/>
<Condition Binding="{Binding Path=(Validation.HasError), ElementName=textBox3}" Value="False"/>
</MultiDataTrigger.Conditions>
<Setter Property="IsEnabled" Value="True"/>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
【问题讨论】:
-
MultiBinding的所有参数都没有改变;它们总是相同的四个文本框。这些绑定只评估一次,因此您的IMultiValueConverter只会被评估一次。您可以考虑使用BindingGroup将所有验证规则拉入一个范围。 -
什么意思它只在开始时起作用?当所有文本框都有效时按钮是否启用并且即使您将某个文本框更改为无效也保持为真?
-
正如 Mike Strobel 所说,绑定在开始时只评估了一次。按钮在开始时启用,因为 Text 属性是正确的,并且当用户将文本设置为无效的内容时它不会更改。感谢您的建议,我将尝试对 BindingGroup 做一些事情
标签: c# wpf button textbox multibinding