C# WPF multibinding button.i通过文本框启用
我是WPF的新手,在网络上找不到解决方案。我的问题是,我希望我的按钮只在四个文本框没有有效性错误时启用。 我的代码是:C# WPF multibinding button.i通过文本框启用,c#,wpf,button,textbox,multibinding,C#,Wpf,Button,Textbox,Multibinding,我是WPF的新手,在网络上找不到解决方案。我的问题是,我希望我的按钮只在四个文本框没有有效性错误时启用。 我的代码是: <Button Content="Action" Click="Action_Click" > <Button.IsEnabled> <MultiBinding Converter="{StaticResource ValCon}"> <Binding ElementName
<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>
我已经注意到,这只是在开始工作。当用户修改其中一个文本框时,它不会。我的值转换器是否需要实现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>
我不会实现IMultiValueConverter,因为我们这里不转换任何内容。 BindingGroup可能会为您服务 使用MVVM/INotifyPropertyChanged的同样有效的方法如下:-
正如迈克所说,文本框没有改变 您可能应该绑定textbox.Text属性 在您的示例中:
<Button Content="Action" Click="Action_Click" >
<Button.IsEnabled>
<MultiBinding Converter="{StaticResource ValCon}">
<Binding ElementName="textBox1" Path="Text"/>
<Binding ElementName="textBox2" Path="Text" />
<Binding ElementName="textBox3" Path="Text"/>
<Binding ElementName="textBox4" Path="Text"/>
</MultiBinding>
</Button.IsEnabled>
</Button>
我所做的是使用您的MultiTrigger解决方案,但在我的例子中,我希望只有当3个文本框的长度为零时,按钮才会被激活,因此我的解决方案使用下面的代码
<Button.Style>
<Style TargetType="Button">
<Setter Property="IsEnabled" Value="True"/>
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=Text.Length, ElementName=activationKeyTextbox}" Value="0"/>
</MultiDataTrigger.Conditions>
<Setter Property="IsEnabled" Value="False"/>
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=Text.Length, ElementName=serialDayStartbox}" Value="0"/>
</MultiDataTrigger.Conditions>
<Setter Property="IsEnabled" Value="False"/>
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=Text.Length, ElementName=serialNumdaysbox}" Value="0"/>
</MultiDataTrigger.Conditions>
<Setter Property="IsEnabled" Value="False"/>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
我知道这很旧,但我也有类似的需求,不想编写bindinggroup和validation。。。注意,这是我的第一个wpf应用程序,也是第一次使用mvvm
<Button Name="AddBtn" Content="Add" Grid.Row="2" Grid.Column="2" Height="30" Width="100" Command="{Binding AddCmd}" CommandParameter="{Binding Pending}" >
<Button.IsEnabled>
<MultiBinding Converter="{StaticResource multiButtonEnabled}" >
<Binding ElementName="tb1" Path="(Validation.Errors)[0]" />
<Binding ElementName="tb2" Path="(Validation.Errors)[0]" />
<Binding ElementName="tb3" Path="(Validation.Errors)[0]" />
</MultiBinding>
</Button.IsEnabled>
</Button>
我使用IDataErrorInfo来捕获模型中的错误,并绑定到一个双精度。WPF很好,在绑定时会为您抛出解析错误,但它们并没有真正为您提供一种方法来钩住这些错误以更改显示给用户的消息,也没有为您提供一个属性来检查是否有一个恼人的错误标记,但这使您可以捕获解析中的错误,而不必检查验证规则中的解析错误。我确信我的无知正在显现,但我们都必须从某个地方开始
多绑定
的所有参数均未更改;它们始终是相同的四个文本框。这些绑定只计算一次,因此您的IMultiValueConverter
将只计算一次。您可能会考虑使用A来将所有验证规则拉到单个范围内。这意味着它只在开始时起作用吗?当所有文本框都有效并且即使您将某个文本框更改为无效时,该按钮是否已启用?正如Mike Strobel所说,绑定在开始时仅评估一次。按钮在开始时被启用,因为文本属性是正确的,并且当用户将文本设置为无效内容时,它不会更改。感谢您的建议,我将尝试使用BindingGroups做一些事情。若您能给出一个代码示例,那个就更好了。因为这对我们来说很难理解,因为我们是WPF和.NET领域的新手。
<Button Name="AddBtn" Content="Add" Grid.Row="2" Grid.Column="2" Height="30" Width="100" Command="{Binding AddCmd}" CommandParameter="{Binding Pending}" >
<Button.IsEnabled>
<MultiBinding Converter="{StaticResource multiButtonEnabled}" >
<Binding ElementName="tb1" Path="(Validation.Errors)[0]" />
<Binding ElementName="tb2" Path="(Validation.Errors)[0]" />
<Binding ElementName="tb3" Path="(Validation.Errors)[0]" />
</MultiBinding>
</Button.IsEnabled>
</Button>
[ValueConversion(typeof(ValidationError), typeof(bool))]
class TxtBoxMultiEnableConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
int i=0;
foreach (var item in values)
{
if (item as ValidationError != null)
{
i++;
}
}
if (i!=0)
{
return false;
}
return true;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotSupportedException();
}
}