2

我浏览了整个互联网,每个论坛,每个博客,曾经,任何地方。我现在确实包含互联网......除了最后一件事;-)。这是问题所在:我有一个 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,因此任何基于代码的解决方案都不是一种选择。

4

2 回答 2

0

查看这些文章,看看它们是否可以帮助您找到数据模板元素:

如何:查找 DataTemplate 生成的元素

C#/WPF:获取 DataTemplate 中元素的绑定路径

于 2013-05-05T07:24:04.673 回答
0

执行验证的 MVVM 方法是使用INotifyDataErrorInfo(或者IDataErrorInfo如果您使用的是 .NET 4.0 或更低版本),因此您不会在 XAML 中定义验证逻辑,而是在模型和视图模型类中定义。

一旦实现它,您将有一个中心位置来查询错误,并且您可以将按钮的触发器绑定到视图模型的INotifyDataErrorInfo.HasErrors属性。

于 2013-05-05T07:15:05.500 回答