我浏览了整个互联网,每个论坛,每个博客,曾经,任何地方。我现在确实包含互联网......除了最后一件事;-)。这是问题所在:我有一个 WPF DataGrid,其中定义了一个列:
<tk:DataGridTemplateColumn Header="First name" Width="100" x:Name="colFirstName">
<tk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox x:Name="tbFirstName" Validation.ErrorTemplate="{DynamicResource errorTemplateYourDetailsGrid}">
<TextBox.Text>
<Binding Path="Firstname" UpdateSourceTrigger="PropertyChanged" NotifyOnValidationError="True">
<Binding.ValidationRules>
<val:RequiredValidationRule ErrorMessage="Invalid or missing first name" ValidatesOnTargetUpdated="True"></val:RequiredValidationRule>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
</DataTemplate>
</tk:DataGridTemplateColumn.CellTemplate>
</tk:DataGridTemplateColumn>
如您所见,我定义了一个名为 errorTemplateYourDetailsGrid 的验证模板。
该页面有一个继续按钮,我想禁用该按钮,直到此网格中的所有字段都有效:
<Button x:Name="btnNext" HorizontalAlignment="Right" DockPanel.Dock="Right" Content="Continue" Command="{Binding YourDetailsNextCommand}" >
<Button.Style>
<Style TargetType="Button" BasedOn="{StaticResource BtnContinue}">
<Setter Property="IsEnabled" Value="false" />
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding ElementName=tbFirstName, Path=(Validation.HasError)}" Value="false" />
<Condition Binding="{Binding ElementName=tbSurname, Path=(Validation.HasError)}" Value="false" />
...etc
</MultiDataTrigger.Conditions>
<Setter Property="IsEnabled" Value="true" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
一位同事使用基于表单的直接布局(不使用数据网格)使这种事情正常工作。所以我猜我需要一些语法来引用 DataGrid 列中单元格中的 TextBox,以便触发触发器。简单地使用 ElementName 是行不通的。当您在这些字段中输入文本时,即使验证模板按预期消失,该按钮仍处于禁用状态。
我正在使用 MVVM,因此任何基于代码的解决方案都不是一种选择。