我是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();
}
}
我注意到这个只在一开始起作用。当用户修改文本框之一时,它就不起作用了。我的值转换器需要实现INotifyPropertyChanged吗?在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