我搜索了整个互联网,每个论坛,每个博客,任何地方。我现在从字面上包含了互联网...除了最后一件事;-)。这就是问题所在:我有一个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的验证模板。
该页面有一个我想禁用的continue按钮,直到此网格中的所有字段都有效:
<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,所以不能选择任何基于代码隐藏的解决方案。
发布于 2013-05-05 15:15:06
执行验证的方法是使用INotifyDataErrorInfo (如果使用XAML4.0或更低版本,则使用IDataErrorInfo ),因此不会在.NET中定义验证逻辑,而是在模型和视图模型类中定义验证逻辑。
一旦实现了它,您就有了一个查询错误的中心位置,并且可以将按钮的触发器绑定到视图模型的INotifyDataErrorInfo.HasErrors属性。
发布于 2013-05-05 15:24:05
请查看这些文章,看看它们是否可以帮助您找到数据模板元素:
How to: Find DataTemplate-Generated Elements
https://stackoverflow.com/questions/16039790
复制相似问题