Mar*_*cin 6 c# wpf textbox button multibinding
我是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>
Run Code Online (Sandbox Code Playgroud)
我的多值转换器就像:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
我注意到这只在一开始就有效.当用户修改其中一个文本框时,它不会.我的值转换器是否需要实现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>
Run Code Online (Sandbox Code Playgroud)
我不会实现 IMultiValueConverter,因为我们在这里不转换任何内容。BindingGroup 可以满足您的目的。
使用 MVVM/INotifyPropertyChanged 的同样有效的方法如下:-