WPF - 在XAML中引用XAML元素

时间:2013-04-16 14:30:37

标签: xaml reference

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

2 个答案:

答案 0 :(得分:0)

MVVM执行验证的方式是使用INotifyDataErrorInfo(如果您使用的是.NET 4.0或更低版本,则使用IDataErrorInfo),因此您不会在XAML中定义验证逻辑,但在您的XAML中model和viewmodel类。

实施后,您将有一个中心位置来查询错误,您可以将按钮的触发器绑定到您的viewmodel的INotifyDataErrorInfo.HasErrors属性。

答案 1 :(得分:0)

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

How to: Find DataTemplate-Generated Elements

C#/WPF: Get Binding Path of an Element in a DataTemplate