我随时随地都在浏览整个互联网,每个论坛,每个博客。我现在确实包含了互联网...除了这最后一件事;-)。这是问题所在:我有一个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,因此任何基于代码隐藏的解决方案都不是一种选择。
答案 0 :(得分:0)
MVVM执行验证的方式是使用INotifyDataErrorInfo
(如果您使用的是.NET 4.0或更低版本,则使用IDataErrorInfo
),因此您不会在XAML中定义验证逻辑,但在您的XAML中model和viewmodel类。
实施后,您将有一个中心位置来查询错误,您可以将按钮的触发器绑定到您的viewmodel的INotifyDataErrorInfo.HasErrors
属性。
答案 1 :(得分:0)
检查这些文章,看看它们是否可以帮助您找到数据模板元素: